-
Modifier un BMP
Bonjour
Je n'arrive pas à programmer un petit .exe qui modifie un bmp.
A partir d'une première image :
http://ld2eme.free.fr/image.bmp
je voudrai que le programme créer une seconde image en remplaçant une couleur par une autre, par exemple le rouge par du mauve.
Pour cela j'ai également créer un fichier "source.txt" dans lequel il y a ça :
1 FF0000
2 00FF00
3 0000FF
4 FFFF00
ce qui correspond aux couleurs de mes surfaces
J'ai ensuite créé un second fichier "modif.txt" :
1 AA6655
2 00FF00
3 0000FF
4 FFFF00
Le programme va donc lire dans le premier fichier et pour la surface "1" de couleur "FF0000" (rouge) il va changer tous les pixels en "AA6655" (selon le second fichier).
Le programme ne doit rien afficher, juste enregistrer la nouvelle image.
J'ai fouillé un peu sur le forum, mais même avec la SDL j'ai du mal, et en plus je ne veux pas passer par un affichage à l'écran...
Merci de votre aide.
-
Bien le bonjour,
Où est-ce que tu bloques ?
Dans les grandes lignes le principe sera le suivant :
* lire les 2 fichiers txt pour trouver les correspondances de couleurs
* lire l'image
* parcourir les pixels et comparer chacun d'eux à tes correspondances
* modifier les pixels en conséquence
* enregistrer la nouvelle image
C'est en effet intéressant de prendre SDL pour lire, modifier et enregistrer l'image et l'utilisation de SDL ne passe pas forcément pas un affichage à l'écran ;)
-
Mon problème est un peu général.
J'arrive pas à lire et remplacer les pixels.
Y a t'il un autre moyen plus simple qu'en passant par la SDL?
Si quelqu'un a un petit code intéressant je suis preneur.
-
Regarde sur http://www.cplusplus.com/src/ il ya du code pour lire une BMP
Sinon sur www.wotsit.org
Mais c'est plus complexe que cela ce que tu demandes ; il faut savoir sur combien de bit par pixels la BMP est composée si c'est 8,16,24..
Vaut mieux utiliser éventuellement des API de Windows avec un BITMAPINFOHEADER...
Sinon sur le MSDN il y a du code pour écrire une BMP un peu complexe..
Mais c'est pas du code portable de toute façon une BMP c'est spécfique à Windows.
Si tu veux du portable prendre PNG par exemple
-
Sans descendre au niveau du format de l'image et en utilisant juste une bibliothèque graphique, tu peux suivre la méthode "naïve":
- Charger l'image en mémoire, en tant que "image" (HBITMAP + HDC pour l'API Win32, autre chose pour SDL)
- Parcourir chaque pixel de l'image avec deux boucles imbriquées
- Pour chacun de ces pixels, lire sa couleur (GetPixel() pour Win32) et la remplacer par la nouvelle)
- Sauvegarder l'image
Bien sûr, dans le cas d'un bitmap à palette (256 couleurs ou moins), on peut faire beaucoup plus rapide en changeant juste la palette, mais ça réclame plus de travail.
-
Merci je crois que j'avance...
http://www.codeproject.com/KB/graphics/rplcolor.aspxJ'ai trouvé ce code, mais j'arrive pas à le compiler, et vous? J'ai peut être mal configuré codeblocks...
Ca marche chez quelqu'un?
voici ce que le build log m'affiche :
Project : RplColor
Compiler : GNU GCC Compiler (called directly)
Directory : C:\Documents and Settings\LDriutti\Bureau\RplColor\
--------------------------------------------------------------------------------
Switching to target: Win32 Release
Compiling: RplColor.rc
Compiling: Main.cpp
Linking executable: C:\Documents and Settings\LDriutti\Bureau\RplColor\Release\RplColor.exe
Release\Main.o:Main.cpp:(.text+0x427): undefined reference to `CreateMappedBitmap@20'
Release\Main.o:Main.cpp:(.text+0x75e): undefined reference to `ImageList_Destroy@4'
Release\Main.o:Main.cpp:(.text+0x8a6): undefined reference to `ImageList_DrawEx@40'
Release\Main.o:Main.cpp:(.text+0x97a): undefined reference to `InitCommonControls@0'
Release\Main.o:Main.cpp:(.text+0x9fa): undefined reference to `ImageList_Create@20'
Release\Main.o:Main.cpp:(.text+0xa11): undefined reference to `ImageList_Add@12'
Release\Main.o:Main.cpp:(.text+0xa29): undefined reference to `ImageList_AddMasked@12'
Release\Main.o:Main.cpp:(.text+0xa6e): undefined reference to `ImageList_AddMasked@12'
Release\Main.o:Main.cpp:(.text+0xab0): undefined reference to `ImageList_AddMasked@12'
Release\Main.o:Main.cpp:(.text+0xaf5): undefined reference to `ImageList_AddMasked@12'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 3 seconds)
-
Compile parfaitement (en C++) sous Visual Studio 2005, du moment que <windows.h> est inclus.
Et linke parfaitement aussi, si tu lies le projet à comctl32.lib (libcomctl32.a).
-
Bin j'ai rien touché au code source donc il y a bien windows.h comme vous pouvez le voir.
http://ld2eme.free.fr/cb.jpg
comctl32.lib... il faut que je le mette dans le même dossier?
Moi j'ai juste téléchargé le Zip et l'ai décompressé, et exécuté avec codblocks mais ça ne marche pas, et je comprend pas pourquoi...
J'ai remarqué qu'il faisait appel à TChar.h et commctrl.h, mais que ces fichiers ne sont pas dans le Zip, c'est normal? J'ai que ressource.h
Vous, pour l'exécuter, vous avez ouvert le fichier .dsp ? ou vous avez créé un nouveau projet dans lequel vous avez intégrer le main et ressource.h?
-
Ajoute le paramètre -lcomctl32 aux options du linker (je ne sais plut trop comment on fait sous C::B).
Moi, je n'ai pas touché au projet. J'ai simplement recopié le code dans un projet existant et rajouté #include<windows.h> en tête...