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
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
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) ?
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
C'est du niveau de gris.
L'utilisation d'une bibliothèque fera parfaitement l'affaire!
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.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
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
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..).
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
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é)
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!
Si tu veux utiliser opencv, il faut effectivement inclure highlib.h et utiliser la fonction cvConvertImage
Si probleme pour le format BMP, fait signe
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.
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
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 :
Et quand je regarde les valeurs de ces memes octets dans le fichier 8 bit couleurs, ils ont la meme valeur.00 00 00 00
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.
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.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
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 !
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.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
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é![]()
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++
Partager