Utilisation libjpeg

fafa21081974 Messages postés 14 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 19 septembre 2005 - 3 août 2005 à 11:36
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007 - 3 août 2005 à 16:48
Bonjour tout le monde





J'ai téléchargé la librairie du groupe JPeg qui permet au vu de ce que
j'ai vu sur les forums de manipuler des fichiers jpeg. Mais le site
ijp.com qui aurait pu me donner plus d'explications n'est pas
accessible.



Aussi j'aurai aimé savoir si l'un ou l'une d'entre vous pourrait me
guider pour in staller la librairie et comment l'utiliser sachant que
je voudrais lire la valeur des pixels





Merci pour votre aide

Fafa_Bouillé

3 réponses

meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
3 août 2005 à 16:11
Salut,

Un bour de code vite fait, car je n'ai pas trop le temps... En résumé, il ouvre le fichier jpeg, donne largeur et hauteur et affiche la valeur de la couleur de chacun des pixels sous forme hexadécimal (genre comme en HTML).

Codé en C, testé sous GNU/Linux Debian (Sarge) 3.1, compilé avec gcc 3.3.5 et libjpeg version 6.2. Sans aucun doute facilement portable sur du Win32 au besoin (il existe un portage de la libjpeg).

J'essaierais, si possible, de poser une vraie source à ce sujet prochainement.

#include <stdio.h>
#include <jpeglib.h>
#include <jerror.h>


int main(int argc, char** argv)
{
unsigned char *image;
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE *file; // descripteur de fichier.
unsigned char *ligne;
int i,j; // utilisées lors des boucles.
int width, height; // largeur & hauteur de l'image


if (argc < 2)
{
fprintf(stderr, "Usage : %s fichier.jpg\n\n", argv[0]);
exit(2);
}


cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
if ((file=fopen(argv[1],"rb"))==NULL)
{
fprintf(stderr, "Echec lors de l'ouverture du fichier '%s'\n", argv[1]);
exit(1);
}
jpeg_stdio_src(&cinfo, file);
jpeg_read_header(&cinfo, TRUE);


// obtention des dimensions de l'image.
width = cinfo.image_width;
height = cinfo.image_height;


// allocation de mémoire pour le stockage des pixels en mémoire.
image = (char*)malloc(width * height * sizeof(unsigned int));


jpeg_start_decompress(&cinfo);
ligne=image;
while (cinfo.output_scanline<cinfo.output_height)
{
ligne=image+3*width*cinfo.output_scanline;
jpeg_read_scanlines(&cinfo,&ligne,1);
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);


fprintf(stdout, "largeur x hauteur = %dx%d\n\n", width, height);

// passe dans chaque colonne de pixels (...)
for (i=0;i<cinfo.image_width;i++)
// (...) puis par ligne
for (j=0;j<cinfo.image_height;j++)
{
// on récupère les valeurs des couleurs RVB (...)
int color_r = image[i*256*3+j*3];
int color_v = image[i*256*3+j*3+1];
int color_b = image[i*256*3+j*3+2];
// enfin, affichage style des couleurs style html.
printf("RVB= #%02x%02x%02x\n", color_r, color_v, color_b);
}
}

Compilation : gcc -o testjpg -c testjpg.c -ljpeg
Utilisation : ./testjpg fichier.jpg

Sûrement existe-il quelques bugs... mais, en espérant t'avoir aidé un peu...
Ciao.
0
fafa21081974 Messages postés 14 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 19 septembre 2005
3 août 2005 à 16:31
Merci meech.



j'ai lu ton code et je vais essayer de l'adapter. je pense que cela
devrait pas mal m'aider car ca correspond quasi à ce qur je voulais.
mais juste une petite question de néophyte que je suis car je démarre
en programmation



à quoi sert exactement la ligne



if (argc < 2)
{
fprintf(stderr, "Usage : %s fichier.jpg\n\n", argv[0]);
exit(2);
}



C'est vraiment sympa.






Fafa_Bouillé
0
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
3 août 2005 à 16:48
A pas grand chose : juste à regarder s'il y a deux paramètres passés à la ligne de commande :

1. Le premier est toujours le nom du programme (et peut-être son chemin complet, je ne sais plus...)

2. Le second, et dans ce code, en particulier, est utilisé pour
spécifier le nom du fichier JPEG à ouvrir. Si ce nom n'est pas fourni,
alors l'application se ferme car elle n'a pas de fichier à ouvrir.



Bon courage et à plus tard.
0
Rejoignez-nous