IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Lecture d'un fichier JPEG (comparaison image)


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Par défaut Lecture d'un fichier JPEG (comparaison image)
    Bonjour à tous,

    Pour une fois mon programme fonctionne ... mais le résultat n'est pas celui est escompté :-)

    J'ouvre 2 fichiers JPEG (dans mon exemple, il s'agit du même fichier), que je compare pixel par pixel.

    Je pense que tout fonctionne sauf le résultat : vu que je compare 2 fichiers les mêmes, le résultat devrait être nulle mais celui-ci n'est pas nul et même différent à chaque fois que je lance le programme. Je pense donc à un problème de mémoire, mais je ne vois pas top bien où

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #include <stdio.h>
    #include <string.h>
    #include <sys/stat.h>
    #include "turbojpeg.h"
     
     
     
    int main(int argc, char** argv)
    {
     
    	const int COLOR_COMPONENTS = 3;
    	int width = 720;
    	int height = 560;
     
        unsigned long size=width * height * COLOR_COMPONENTS;
    	unsigned long r=0;
    	unsigned long g=0;
    	unsigned long b=0;
    	int jpegSubsamp;
    	int inColorspace;
     
        unsigned char* compressedImage1 = NULL;
    	unsigned char* compressedImage2 = NULL;
     
    	unsigned char buffer1[width * height * COLOR_COMPONENTS+1];
    	unsigned char buffer2[width * height * COLOR_COMPONENTS+1];
     
    	FILE* fichier_jpeg1 = NULL;
    	FILE* fichier_jpeg2 = NULL;
     
    	fichier_jpeg1 = fopen("/home/seb/c/file.jpeg", "r");//ouverture du fichier
    	fread(compressedImage1, 1, 720*560, fichier_jpeg1);//lecture du fichier
    	fclose(fichier_jpeg1);// fermeture du fichier
     
    	fichier_jpeg2 = fopen("/home/seb/c/file.jpeg", "r");//ouverture du fichier
    	fread(compressedImage2, 1, 720*560, fichier_jpeg2);//lecture du fichier
    	fclose(fichier_jpeg2);// fermeture du fichier
     
    	const char *subsampName[TJ_NUMSAMP] = {
      "4:4:4", "4:2:2", "4:2:0", "Grayscale", "4:4:0", "4:1:1"
    };
     
    const char *colorspaceName[TJ_NUMCS] = {
      "RGB", "YCbCr", "GRAY", "CMYK", "YCCK"
    };
     
    	tjhandle jpegDecompressor = tjInitDecompress();
     
    	if (tjDecompressHeader3(jpegDecompressor, compressedImage1, size, &width, &height, &jpegSubsamp,&inColorspace)<0)
    		printf("lecture JPEG header image1\n");
     
    	printf("Image1:  %d x %d pixels, %s subsampling, %s colorspace\n",width, height,subsampName[jpegSubsamp], colorspaceName[inColorspace]);
     
    	if (tjDecompressHeader3(jpegDecompressor, compressedImage2, size, &width, &height, &jpegSubsamp,&inColorspace)<0)
    		printf("lecture JPEG header image2\n");
     
    	printf("Image2:  %d x %d pixels, %s subsampling, %s colorspace\n",width, height,subsampName[jpegSubsamp], colorspaceName[inColorspace]);
     
     
    	if(tjDecompress2(jpegDecompressor, compressedImage1, size, buffer1, width, 0, height, TJPF_RGB, TJFLAG_FASTDCT)<0)
    		printf("decompressing JPEG image1\n");
    	if(tjDecompress2(jpegDecompressor, compressedImage2, size, buffer2, width, 0, height, TJPF_RGB, TJFLAG_FASTDCT)<0)
    		printf("decompressing JPEG image2\n");	
    	tjDestroy(jpegDecompressor);
     
     
    	unsigned char *bufPtr1 = buffer1;
    	unsigned char *bufPtr2 = buffer2;
    	for(int i=0; i<560; i++)
    	{
     
    		for(int j=0; j<720; j++)
    		{
    				//printf("%d %d \n",*bufPtr1,*bufPtr2);
    				r += *bufPtr1-*bufPtr2;
    				bufPtr1++;
    				bufPtr2++;
    				g += *bufPtr1-*bufPtr2;
    				bufPtr1++;
    				bufPtr2++;
    				b += *bufPtr1-*bufPtr2;
    				bufPtr1++;
    				bufPtr2++;
    				//r += *bufPtr1++;
    				//g += *bufPtr1++;
    				//b += *bufPtr1++;
     
     
    		}
     
    	}
    	tjFree(compressedImage1);
    	tjFree(compressedImage2);
     
    	printf("r=%lu g=%lu b=%lu\n",r,g,b);
     
        return 0;
    }
    voici le fichier JPEG en question "file.jpeg"Nom : file.jpeg
Affichages : 214
Taille : 53,0 Ko

    Merci de votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
        unsigned char* compressedImage1 = NULL;
    	unsigned char* compressedImage2 = NULL;
     
    	unsigned char buffer1[width * height * COLOR_COMPONENTS+1];
    	unsigned char buffer2[width * height * COLOR_COMPONENTS+1];
     
    	FILE* fichier_jpeg1 = NULL;
    	FILE* fichier_jpeg2 = NULL;
     
    	fichier_jpeg1 = fopen("/home/seb/c/file.jpeg", "r");//ouverture du fichier
    	fread(compressedImage1, 1, 720*560, fichier_jpeg1);//lecture du fichier
    	fclose(fichier_jpeg1);// fermeture du fichier
     
    	fichier_jpeg2 = fopen("/home/seb/c/file.jpeg", "r");//ouverture du fichier
    	fread(compressedImage2, 1, 720*560, fichier_jpeg2);//lecture du fichier
    	fclose(fichier_jpeg2);// fermeture du fichier
    C'est quoi ces +1 et comment espères-tu lire 720*560 bytes dans des pointeurs null ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Par défaut
    Merci !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include "turbojpeg.h"
     
     
     
    int main(int argc, char** argv)
    {
     
    	const int COLOR_COMPONENTS = 3;
    	int width = 720;
    	int height = 560;
     
        unsigned long size=width * height * COLOR_COMPONENTS;
    	double r=0.0000;
    	double g=0.0000;
    	double b=0.0000;
    	int jpegSubsamp;
    	int inColorspace;
     
        unsigned char* compressedImage1=(unsigned char*)malloc(width * height * COLOR_COMPONENTS);
    	unsigned char* compressedImage2=(unsigned char*)malloc(width * height * COLOR_COMPONENTS);
     
    	unsigned char buffer1[width * height * COLOR_COMPONENTS];
    	unsigned char buffer2[width * height * COLOR_COMPONENTS];
     
    	FILE* fichier_jpeg1 = NULL;
    	FILE* fichier_jpeg2 = NULL;
     
    	fichier_jpeg1 = fopen("file1.jpeg", "rb");//ouverture du fichier
    	if(!fichier_jpeg1)
    	{
    	printf("erreur lecture JPG 1");	
    	}
    	fread(compressedImage1, 1, 720*560, fichier_jpeg1);//lecture du fichier
    	fclose(fichier_jpeg1);// fermeture du fichier
     
    	fichier_jpeg2 = fopen("file2.jpeg", "rb");//ouverture du fichier
    	if(!fichier_jpeg1)
    	{
    	printf("erreur lecture JPG 2");	
    	}
    	fread(compressedImage2, 1, 720*560, fichier_jpeg2);//lecture du fichier
    	fclose(fichier_jpeg2);// fermeture du fichier
     
    	const char *subsampName[TJ_NUMSAMP] = {
      "4:4:4", "4:2:2", "4:2:0", "Grayscale", "4:4:0", "4:1:1"
    };
     
    const char *colorspaceName[TJ_NUMCS] = {
      "RGB", "YCbCr", "GRAY", "CMYK", "YCCK"
    };
     
    	tjhandle jpegDecompressor = tjInitDecompress();
     
    	if (tjDecompressHeader3(jpegDecompressor, compressedImage1, size, &width, &height, &jpegSubsamp,&inColorspace)<0)
    		printf("lecture JPEG header image1\n");
     
    	printf("Image1:  %d x %d pixels, %s subsampling, %s colorspace\n",width, height,subsampName[jpegSubsamp], colorspaceName[inColorspace]);
     
    	if (tjDecompressHeader3(jpegDecompressor, compressedImage2, size, &width, &height, &jpegSubsamp,&inColorspace)<0)
    		printf("lecture JPEG header image2\n");
     
    	printf("Image2:  %d x %d pixels, %s subsampling, %s colorspace\n",width, height,subsampName[jpegSubsamp], colorspaceName[inColorspace]);
     
     
    	if(tjDecompress2(jpegDecompressor, compressedImage1, size, buffer1, width, 0, height, TJPF_RGB, TJFLAG_FASTDCT)<0)
    		printf("decompressing JPEG image1\n");
    	if(tjDecompress2(jpegDecompressor, compressedImage2, size, buffer2, width, 0, height, TJPF_RGB, TJFLAG_FASTDCT)<0)
    		printf("decompressing JPEG image2\n");	
    	tjDestroy(jpegDecompressor);
     
     
    	unsigned char *bufPtr1 = buffer1;
    	unsigned char *bufPtr2 = buffer2;
    	for(int i=0; i<560; i++)
    	{
     
    		for(int j=0; j<720; j++)
    		{
    				//printf("%d %d \n",*bufPtr1,*bufPtr2);
    				r += abs((*bufPtr1-*bufPtr2)/255.0000);
    				bufPtr1++;
    				bufPtr2++;
    				g += abs((*bufPtr1-*bufPtr2)/255.0000);
    				bufPtr1++;
    				bufPtr2++;
    				b += abs((*bufPtr1-*bufPtr2)/255.0000);
    				bufPtr1++;
    				bufPtr2++;
     
     
     
    		}
     
    	}
    	tjFree(compressedImage1);
    	tjFree(compressedImage2);
     
    	printf("r=%f g=%f b=%f\n",r,g,b);
     
        return 0;
    }

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par sebaaas Voir le message
    Merci !
    Tu as remarqué que si le fichier 1 n'a pas été ouvert, tu le lis quand-même (et idem pour le fichier 2) ???
    Faire une gestion d'erreurs c'est bien, encore faut-il réellement la faire sinon ça sert à que dalle.

    Et pour ouvrir un fichier binaire c'est "rb" et non "r". Ok tu es sous Linux donc ça ne fait pas de différence mais ça en fera si tu veux porter tes codes dans des OS qui , eux, différencient les deux.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Et tu ne récupères ni ne testes la valeur de retour de fread(). C'est pourtant la size que tu dois passer à tjDecompress2().
    Tu supposes une taille de fichier de 720*560, ça n'a pas de sens pour un fichier jpeg. Tu peux supposer que la compression fait son boulot et que la taille devrait être inférieure à 720*560*3, mais tu n'en sais pas plus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Image] API De traitement de fichier JPEG
    Par Floréal dans le forum 2D
    Réponses: 10
    Dernier message: 20/01/2010, 09h42
  2. lecture fichier et comparaison chaines de caracteres
    Par john123 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 08/05/2007, 11h38
  3. lecture de fichier avec comparaison
    Par idsec dans le forum Web
    Réponses: 1
    Dernier message: 25/04/2007, 17h25
  4. Réponses: 2
    Dernier message: 13/09/2006, 19h18
  5. Réponses: 2
    Dernier message: 13/12/2004, 23h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo