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 :

Convertion d'une image png vers l'hexadécimal


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    Points : 19
    Points
    19
    Par défaut Convertion d'une image png vers l'hexadécimal
    Bon jour,
    Est ce qu'il y a un moyen d'afficher le contenu d'une image png sous format hexadécimale? ex: 0x89ffdd...
    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FILE *f = NULL;
    char *buffer = malloc(11 * size(char));
    if(f = fopen("./image.png","rb"))
           {
    	while(!feof(f))
    		{
    		fread(buffer, 1, 10, f);
    		printf("%x", buffer);
    		}
    	fclose(f);
    	}
    free(buffer);
    ça affiche un nombre hexadécimale qui se répète des centaines de fois c896b8 et à la fin un autre nombre ea13f8 mais ça peut pas être correcte car l'image contient beaucoup d'informations.
    Est ce que vous pouvez m'aider à stoquer la valeur hexadécimale extraite à partir d'une image png dans une variable? Merci.

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    salut,

    à tester, mais je pense que:

    - fread devrait lire les octets 4 par 4 (ie. un unsigned int) et les stocker dans un 'unsigned int'

    - printf devrait afficher cet unsigned int.

    genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FILE *f = NULL;
    unsigned int buffer;
    if(f = fopen("./image.png","rb"))
           {
    	while(!feof(f))
    		{
    		fread(&buffer, 4, 1, f);
    		printf("%x", buffer);
    		}
    	fclose(f);
    	}
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    Points : 19
    Points
    19
    Par défaut
    Merci ça marche.
    Est ce que vous pouvez m'expliquer pourquoi vous avez utilisez un passage par adresse dans fread et comment je peux stocker le résultat au lieu de l'afficher (strcat ne s'applique que sur les char).

  4. #4
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Citation Envoyé par smalldebian Voir le message
    Est ce que vous pouvez m'expliquer pourquoi vous avez utilisez un passage par adresse dans fread
    PArce que fread s'attend à un pointeur vers une zone mémoire dans laquelle il va pouvoir stocker cde qu'il lit. Et vu qu'on a changé le type (de char* vers unsigned int), il faut bien passer un pointeur vers note unsigned int.

    comment je peux stocker le résultat au lieu de l'afficher (strcat ne s'applique que sur les char).
    1/ Calculer la taille totale du fichier (en octets)
    2/ Allouer un char* d'une taille suffisante qui contiendra le résultat final "resultString" (2 caractères pour chaque octet de l'image + le '\0' de fin de chaîne.
    3/ avoir une chaîne de caractère temporaire "temp" pour stocker la chaîne générée à chaque itération dans le while (on lit 4 octets => on va générer une chaîne de 4 x 2 + 1 ('\0' de fin de chaîne) octets .

    3/ pour chaque itération du while:
    * faire un sprintf au lieu du printf pour non pas écrire le résultat à l'écran mais dans "temp"
    * faire un strcat(resultString, temp);

    4/ resultString devrait contenir à la fin la totalité du fichier sous forme de chaîne de caractère hexa.
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Déjà, utilisez %02x ou %08x (selon que vous travaillez avec des char ou des int) pour afficher les octets, ou vous aurez des problèmes d'alignement.

    Ensuite, je conseille d'utiliser des char plutôt que des int, pour éviter les problèmes d'endianness.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par nouknouk Voir le message
    PArce que fread s'attend à un pointeur vers une zone mémoire dans laquelle il va pouvoir stocker cde qu'il lit. Et vu qu'on a changé le type (de char* vers unsigned int), il faut bien passer un pointeur vers note unsigned int.


    1/ Calculer la taille totale du fichier (en octets)
    2/ Allouer un char* d'une taille suffisante qui contiendra le résultat final "resultString" (2 caractères pour chaque octet de l'image + le '\0' de fin de chaîne.
    3/ avoir une chaîne de caractère temporaire "temp" pour stocker la chaîne générée à chaque itération dans le while (on lit 4 octets => on va générer une chaîne de 4 x 2 + 1 ('\0' de fin de chaîne) octets .

    3/ pour chaque itération du while:
    * faire un sprintf au lieu du printf pour non pas écrire le résultat à l'écran mais dans "temp"
    * faire un strcat(resultString, temp);

    4/ resultString devrait contenir à la fin la totalité du fichier sous forme de chaîne de caractère hexa.
    Bonjour,
    Merci pour ton aide, ça a l'air de marcher mais le resultString ne contient que les 4 derniers octets du fichier je vois pas c du à quoi.

  7. #7
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Citation Envoyé par smalldebian Voir le message
    je vois pas c du à quoi.
    Sans code, nous non plus

    Déjà, utilisez %02x ou %08x (selon que vous travaillez avec des char ou des int) pour afficher les octets, ou vous aurez des problèmes d'alignement.
    +1

    Ensuite, je conseille d'utiliser des char plutôt que des int, pour éviter les problèmes d'endianness.
    +1+1 = +2
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    Points : 19
    Points
    19
    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
    18
    19
    20
    21
    22
    23
     
    char *buffer22 = malloc(5 * sizeof(char));
    char *buffer3 = NULL;
    unsigned int buffer2;
    long Taille = 0;
    FILE *f = NULL;
    unsigned int buffer2;
    if(f = fopen(file_name,"rb"))
    	{   
    	fseek(f , 0, SEEK_SET );
    	fseek(f , 0, SEEK_END );
    	Taille = ftell(f);
    	fseek(f , 0, SEEK_SET );
    	buffer3 = malloc(((Taille * 4)+1) * sizeof(char));
    while(!feof(f))
    	{
    	fread(&buffer2, 4, 1, f);
    	sprintf(buffer22, "%x", buffer2);					
    	strcat(buffer3, buffer22);
    	}
    printf("%x", buffer3);
    fclose(f);
    }

  9. #9
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Citation Envoyé par smalldebian Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	buffer3 = malloc(((Taille * 4)+1) * sizeof(char));
    Je pense qu'il faudrait commencer par ajouter un caractère de fin de chaine après avoir initialisé buffer3:
    De plus, la taille de ton buffer22 n'est pas correcte non plus. Comme le disait mon post précédent, on génère 2 caractères par octet lu (un octet = une valeur entre 0 et 255, soit en hexa entre 00 et FF), donc buffer22 doit faire:
    4 octets lus * 2 caractères par octet + 1 caractère de fin de chaîne = 9 caractères en tout, et pas 5.

    Enfin, même principe, il faut terminer le chaîne par le caractère de fin de chaîne '\0'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *buffer22 = malloc(9 * sizeof(char));
    buffer22[8] = '\0';
    Même si ça ne résout pas tout, ça ne peut pas faire de mal
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    Points : 19
    Points
    19
    Par défaut
    Bonjour,
    J'ai réussi la conversion vers l'hexadécimale avec le code :
    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
     
    FILE *f = NULL;
    unsigned int buffer2;
    if(f = fopen(file_name,"rb"))
    	{   
    	fseek(f , 0, SEEK_SET );
    	fseek(f , 0, SEEK_END );
    	Taille = ftell(f);
    	fseek(f , 0, SEEK_SET );
    	buffer3 = (char*) malloc(((Taille * 2)+3) * sizeof(char));
    	buffer3[0]='0';
    	buffer3[1] = 'x';
    	buffer3[2] = '\0';
    	int j = 0,k = 10;
    	while(!feof(f))
    		{
    		fread(&buffer2, 4, 1, f);
    		sprintf(buffer22, "%x", buffer2);
    		buffer22[8] = '\0';
    		strcat(buffer3, buffer22);
    		j = j + k;
    		buffer3[j] ='\0';
    		if(j==10)k = 8;						
    		}
    		printf("%x", buffer3);
            fclose(f);
            }
    Mais il y a un tout petit problème les valeurs commencent par 0x474e5089a1a... or le format png commencent toujours par 0x89504e470d0a1a0.... qlqun sait c du à quoi svp?

  11. #11
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Mais il y a un tout petit problème les valeurs commencent par 0x474e5089 or le format png commencent toujours par 0x89504e47 qlqun sait c du à quoi svp?
    Problème d'endianness : comme tu lis les données 32 bits par 32 bits en les stockant dans un int 32 bits, le processeur inverse l'ordre des octets à l'intérieur.
    Pour résoudre le problème, il faudrait lire les octets 1 à 1.

    PS : feof ne s'utilise pas comme tu le fait : feof s'utilise après un échec d'une fonction de lecture (fread, fgetc, fscanf...) pour savoir si l'erreur de lecture est due à une fin de fichier.

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    Points : 19
    Points
    19
    Par défaut
    Bonjour,
    Merci bcp Mabu, ton poste m'a bcp aider.
    Pour ceux qui veulent savoir comment procéder:
    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
     
    				FILE *f = NULL;
    				char buffer2 = '\0';
    				if(f = fopen(file_name,"rb"))
    					   {   
    					fseek(f , 0, SEEK_SET );
    					fseek(f , 0, SEEK_END );
    					Taille = ftell(f);
    					fseek(f , 0, SEEK_SET );
    					buffer3 = (char*) malloc(((Taille * 2)+3) * sizeof(char));
    					buffer3[0]='0';
    					buffer3[1] = 'x';
    					buffer3[2] = '\0';
    					int n = 0;
    					while(n = fread(&buffer2, 1, 1, f) > 0)
    						{
    						sprintf(buffer22, "%02x", buffer2);
    						if(strlen(buffer22)==8)
    						{
    						sprintf(buffer222, "%c%c", buffer22[6], buffer22[7]);
    						strcat(buffer3, buffer222);
    						}
    						else strcat(buffer3, buffer22);				
    						}
    						buffer3[strlen(buffer3)] = '\0';
    						free(buffer22);
    						free(buffer222);
    					fclose(f);
    					}
    Avec biensur les variables, les malloc et les free qui va avec.

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

Discussions similaires

  1. Envoyer une image .png vers Word
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 23/06/2014, 16h46
  2. Réponses: 4
    Dernier message: 09/02/2006, 17h44
  3. [ImageMagick] Affichage d'une image png
    Par JavaAcro dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 06/02/2006, 09h13
  4. [Image] Décomposer une image png.
    Par Quintoff dans le forum 2D
    Réponses: 3
    Dernier message: 06/01/2006, 20h22
  5. [Cross-Browser] Couleur d'une image PNG
    Par [BkM-) dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/11/2005, 21h00

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