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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    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 : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    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);
    	}

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    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 : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    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.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    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.

  6. #6
    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 : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    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

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.

+ 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