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

Bibliothèques Discussion :

Convertir une image BMP 8 bits en BMP 24 bits


Sujet :

Bibliothèques

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 4
    Points
    4
    Par défaut Convertir une image BMP 8 bits en BMP 24 bits
    Bonjour,

    Tout est dans le sujet

    Je dois convertir une image bitmal 8 bits en image bitmap 24 bit.
    Paint le fait très bien, mais je veux le faire par le bon vieux c++ !

    Je n'ai rien vu à ce sujet sur ce forum dans les précédents post.

    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    8 bits niveaux de gris, ou 256 couleurs palletisées ?

    Tu veux utiliser une bibliothèque (il y en a plus qu'il n'en faut) ou tout te taper à la main (ce qui me parait inutile, sauf pour un exo) ?

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    C'est du niveau de gris.

    L'utilisation d'une bibliothèque fera parfaitement l'affaire!

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Alors tu peux regarder du côté de DevIL (openil.sourceforge.net) par exemple.

    Peut-être même que tu peux t'en tirer avec des fonctions du GDI, je sais qu'elles gèrent les bitmaps mais je ne sais pas ce qu'il en est des conversions.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Il y a une bibliothèque qui est pas mal elle permet de faire de la manipulation, convertion d'images...

    C'est Image magick : http://www.imagemagick.org/

    Tu trouve des binding vers divers langages : Perl, C, C++, Python, PHP, Ruby, Tcl/Tk ou Java

    et elle tourne sur pas mal d'architecture : Unix, Linux, Windows...

    Luther

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Après une recherche, les fonctions du GDI ne permetent pas de faire ce que je désire.

    Je vais voir Devil...

    Pour Image magick, j'ai téléchargé le source (24Mo), et voilà...
    Aïe aïe aïe... J'ai regardé, j'ai vu en faisant des recherches de texte qu'on peut convertir certains formats, vers d'autres, mais passer de 8bits en 24 bits un meme bitmap, ce n'est pas flagrant (mais c'est peut etre possible avec ça je ne sais pas..).

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Après une recherche plus approfondie, GDI+ peut, peut-être m'aider.

    Seulement, mon Visual c++ n'a pas l'air de connaitre le gdiplus.h etc, je crois savoir que je dois mettre à jour ma platform SDK? Ou, que dois-je faire ? Pouvez vous m'indiquer des liens?

    J'ai passé ma soirée hier a rechercher une mise à jour de la platform SDK pour utiliser les fonctions du GDI+, mais je n'ai rien trouvé, mis a part pour Windows XP SP2, alors que je suis sous le SP1.

    merci

  8. #8
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut
    En meme temps, convertir une image BMP 8 bits en 24bits revient juste à la lire, remplacer tous les les index de ta LUT (table contenant les 256 valeurs de niveaux de gris. Se situe en dernier dans l'entete d'un fichier BMP), par la valeur correspondante (x3 pour coder les 3 composantes RGB suivi d'un unsigned char à 0 pour la composante alpha)....

    C'est très simple et rapide à faire, tape "format" et "B?P" sur google; tu trouvera tout.

    Sinon y'a la lib OpenCv (dans highlib.h je pense) qui peut gérer ça (meme si c'est utiliser une formule 1 pour aller au super marché )
    Avant de poser une question, lire la Avant de répondre, lire la question

  9. #9
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    C'est surement très simple oui, j'ai l'idée dans ma tête, mais pas le code
    Je vais essayer de me pencher la dessus... mais j'ai deja fait moulte recherche sur google, (en cherchant du code) mais sans trop de succès!

  10. #10
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut
    Si tu veux utiliser opencv, il faut effectivement inclure highlib.h et utiliser la fonction cvConvertImage

    Si probleme pour le format BMP, fait signe
    Avant de poser une question, lire la Avant de répondre, lire la question

  11. #11
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Alors, je suis parti sur tout autre chose..!
    Après reflexion et étude d'un BITMAP, j'en suis venu à ça (on va tenter d'être clair...) :

    Avec le bon vieux PAINT, j'ai ouvert mon bitmap 8 bits monochrome.
    Je l'ai converti en BMP 24 bits. J'ai ensuite colorier tout ce qui était blanc, en rouge (car je le rappel, mon but est de mettre en noir ce qui est en noir, et en rouge ce qui est en blanc). Après avoir fait mon coloriage, j'ai re sauvegardé cette image en format 8 Bits. Et là, la couleur rouge est restée.
    J'en suis donc venu à la conclusion suivante :

    Pas besoin de s'embêter à convertir une image en 24 bits pour la colorier. (si si..)

    Du coup, je me suis interessé toute cette matinée à l'en-tête des bitmap (à l'aide de l'editeur hexa de visual c++ et de documentations diverses). J'ai donc l'idée suivante :
    Recopier toute l'en-tete avec la palette, de mon image 8 Bits coloriée en rouge, stocker tout les caractère hexadecimal quelque part, et recopier toute cette en-tête vers mon image 8 bits monochrome.
    Une fois donc l'en-tête modifée, je n'ai plus que remplacer partout où il y a des FF par des E0 (ca les mettra en rouge, j'ai vu ça en ouvrant le bitmap 8bits couleur avec l'editeur hexa) et les 00 par des.. 00 ! Puisque je ne touche pas à la couleur noire.

    Donc mon soucis est maintenant d'écrire une en-tête dans une autre en-tête.. Je suis sur le code actuellement, et je commence à bloquer au niveau de l'écriture.

  12. #12
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut
    Si effectivement tu ne veut que mettre en rouge ce qui etait blanc (codé 255 255 255), tu n'as rien d'autre à changer dans ton entete que la "case" de ton index de couleur correspondant a 255 255 255...

    Comme je te l'ai dit, sur google, en francais, tu trouveras ton bonheur sur les entetes BMP. Si tu te sert d'un editeur hexa decimal, tu as du comprendre que les octets etaient ecrit dans le sens : octet de poid le plu s faible vers l'octet de poid le plus fort. Ainsi, si la largeur de ton image est codé sur 4octets (il me semble) o1 o2 o3 o4, le sens "logique" de lecture si tu devais l'ecrire en binaire sur une feuille serait o4 o3 o2 o1.

    Il te faut donc fonctionner qu'avec des variables de type unsigned char (puisque l'unité est le byte (octet en francais, desole, je ne connait pas ton niveau)), et coder des fonction qui te permette de lire par des "mots" de 2 et 4 octets: pour lire un mot de 2octets, tu peux une concatenation (dans le bon sens sinon autant lire en une fois 2 octets) de 2 fread (en specifiant que tu ne lit qu'un octet dans tes parametres) par exemple.

    Bon, si vraiment tu bloques g peut etre un bout de code dans un coin, un peu fait à l'arrache, mais il doit y avoir les fonctions de base
    Avant de poser une question, lire la Avant de répondre, lire la question

  13. #13
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Modfier la palette, d'accord.
    Mais qu'on soit d'accord sur la constitution d'un BMP :

    En tete du fichier -> 14 octets
    En tete du bitmap -> 40 octes
    Palette -> 4 octets
    Corps de l'image -> le reste ?

    En regardant avec mon editeur hexa, mon image 8 bits monochrome, je m'aperçois que les 4 octets de la palette ont pour valeur :

    00 00 00 00
    Et quand je regarde les valeurs de ces memes octets dans le fichier 8 bit couleurs, ils ont la meme valeur.

    Donc en gros, je ne vois pas quel case je dois modifier !

    J'ai bien compris hier que les octets étaient dans ce sens la!

    Et, aussi, tu me parles de valeurs 255 255 255 pour le blanc, mais, c'est sur 8 bits, donc le blanc correspond a 255 tout court, hein? Malentendu ou j'ai rien compris?

    Je suis bien dans des variables unsigned char.

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La palette fera bien plus que 4 octets, en théorie pour du 8 bits paletisé elle aura 256 entrées, correspondant chacunes à une couleur. T'as dû mal localiser la palette dans la structure des bmp.

  15. #15
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Ha bah c'est d'un coup plus clair!
    J'ai lu que la palette éait codée sur 4 octets

    -La composante bleue
    -La composante verte
    -La composante rouge
    -Un champ réservé

    Mais maintenant que tu me dis ça Loulou, je comprend mieux pourquoi mon image commence au 1079ème octets...

    14 octets pour la première en-tête
    40 octets pour la deuxième en-tête
    256 pour la composante bleue
    256 pour la composante verte
    256 pour la composante rouge
    256 pour le champs éservé

    Ca nous fait un total de 1078 octets !

    Donc je dois copier tous ces 1078 premiers octets pour mettre cette satanée image monochrome en couleurs !
    Je ne dois pas modifierque quelques octets, si? Non hein, ou alors je vois pas les quels, car la palette monochrome est vachement différente de la palette couleurs !

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En niveaux de gris il n'y a normalement pas de palette, les 8 bits de chaque pixel sont son niveau de gris et non son entrée dans la palette.

    Donc il faut transformer ton image niveau de gris en 8 bits palettisé, puis localiser l'entrée correspondant au noir et la remplacer par du rouge.

  17. #17
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bon.... Bonne nouvelle pour Loulou et harsh :

    J'ai mon image en rouge et noir !

    Mettre mon code ici (un peu barbare mais commenté tout de meme) peut être utile ?

    Et sinon, je vous remercie tous les deux et un chapeau bas à Loulou (un de plus?) pour tout le taff que tu proccures et la disponibilité

  18. #18
    mat.M
    Invité(e)
    Par défaut
    Avec les API standard de Windows il ya un moyen de redéfinir la profondeur de pixels d'une image plutôt que de faire sa cuisine dans le fichier BMP
    Il suffit de redéfinir le BITMAPINFOHEADER et sauvegarder l'image.
    Dans le MSDN il y a tout un coe source complexe certes qui indique comment sauvegarder une bmp.
    J'avais mis un lien dessus dans la FAQ de VC++

Discussions similaires

  1. convertir une image bmp de 24 bits en 8 bits
    Par nissame143 dans le forum Images
    Réponses: 3
    Dernier message: 18/04/2009, 08h38
  2. Convertir une image Gif en Bmp
    Par alen dans le forum MFC
    Réponses: 3
    Dernier message: 11/10/2005, 21h55
  3. Comment convertir une image en BMP ?
    Par blaiseac dans le forum Langage
    Réponses: 6
    Dernier message: 30/07/2005, 18h24
  4. Comment convertir une image bmp en png??
    Par Leclair2000 dans le forum Langage
    Réponses: 2
    Dernier message: 03/05/2005, 08h15
  5. [C#] Comment convertir une image bmp en jpg !!!
    Par vandeyy dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/07/2004, 20h37

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