Forum Clubic

Api windows gdi c++ bmp monochrome->couleur?

Bonjour,

Je cherche à passer une image bitmap monochrome en couleur dans un programme cpp utilisant l’api windows GDI.

Si quelqu’un serai comment faire, ce serai vraiment magique.

Merci d’avance

PS:Si vous avez besoin de plus de détails, n’hésitez pas à demander…

tu paies combien?

J’pai pas, j’demande de l’aide, j’suis même payé pour ça mais si tu veux pas m’aider, ce message s’adresse pas à toi.

Faudrai déja que t’arrive à résoudre le pb

je ne vois pas où est ton problème vu que tu n’as même pas essayer de le faire …

Pour info j’ai fait cela en projet école …
Edité le 21/02/2008 à 15:57

En fait si j’ai essayé, si tu veu le détail, je dois faire un plugin qui scan une image en monochrome qui fai une analyse graphique en couleur qui s’affiche sur l’image. Le problème c’est qu’avec une image en couleur ça marche nickel alors aqu’avec une image en noir et blanc je perd les couleurs de l’analyse à chaque rafraichissement de la fenêtre.

En gros mon code ça donne :

void InitialiseImageMemoire()//Initialise le context mémoire avec l’image BMP du disque
{
hDC_Area = (HDC)PA_GetUpdateHDC();
hDC_Memory =CreateCompatibleDC(hDC_Area);
SetStretchBltMode(hDC_Memory,HALFTONE);
hBmp_Memory = (HBITMAP)LoadImage(NULL,“C:\TEST4.BMP”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE+LR_CREATEDIBSECTION);
//hBmp_Memory2 = (HBITMAP)LoadImage(NULL,“C:\TEST.BMP”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
GetObject(hBmp_Memory, sizeof(BmpTmp), &BmpTmp);//BmpTmp->BITMAP
DrawState(hDC_Memory,NULL,NULL,(LPARAM)hBmp_Memory,0,0,0,0,0,DST_BITMAP);
SelectObject(hDC_Memory, hBmp_Memory);
bImageChargee = true;
}

void RedessineImageZone(PA_PluginParameters params)//Affiche l’image dans la fenêtre 4d et affiche les dessins effectués
{

if(bImageChargee)
{	
	ReleaseDC((HWND)PA_GetHWND(0L), hDC_Area);
	ConvertPA_RectToRect( PA_GetAreaRect(params), &AreaRECT);
	DrawState(hDC_Area,NULL,NULL,(LPARAM)&BmpTmp,0,0,0,0,0,DST_BITMAP+DSS_NORMAL);
	SetStretchBltMode(hDC_Area,HALFTONE);
	StretchBlt(hDC_Area, 0, 0, AreaRECT.right-AreaRECT.left, AreaRECT.bottom-AreaRECT.top, hDC_Memory, 0, 0, BmpTmp.bmWidth, BmpTmp.bmHeight,SRCCOPY);
	if(bArcTracé==false)
	{
		DessineArc(RGB(255,0,0),10,250,0,100,true);
		DessineCercle(RGB(0,255,0),10,50,true);
		DessineCercle(RGB(145,212,56),10,300,true);
		POINT hg,bd;
		hg.x = 50;
		hg.y = 200;
		bd.x= 300;
		bd.y= 50;
		DessineRect(RGB(56,210,124),10,hg,bd,false);
		int i,j;
		for(i=(AreaRECT.left+AreaRECT.right)/2-2;i<=(AreaRECT.left+AreaRECT.right)/2+2;i++)
		{
			for (j=(AreaRECT.bottom+AreaRECT.top)/2-2;j<=(AreaRECT.bottom+AreaRECT.top)/2+2;j++)
			{
				ChangePixel(RGB(250,0,250),i,j);
			}
		}
		StretchBlt(hDC_Memory, 0, 0, AreaRECT.right-AreaRECT.left, AreaRECT.bottom-AreaRECT.top, hDC_Area , 0, 0, BmpTmp.bmWidth, BmpTmp.bmHeight,SRCCOPY);
		bArcTracé=true;
	}
}

}

La ligne commenté dans la fonction InitialiseImageMemoire est celle qui charge l’image en couleur avec elle ça marche nickel.

PS:Tu vois bien que j’ai essayé, en fait, ça fait une semaine que je trime dessus et j’ai pas l’habitude de demander de l’aide sauf quand j’en ai vraiment de besoin et que j’y arriverai pas tout seul

Ben voila c’est mieux :slight_smile:

tu as des exemples ici
lien…
sinon est ce que le chargement de ton image monochrome s’effectue correctement? est ce que l’analyse graphique en couleur qui n’est pas effectuée?

ton analyse graphique est effectuée par RedessineImageZone ?
Edité le 21/02/2008 à 17:17

Je ne peu pas divulguer le code de mon analyse graphique mais il n’y a pas de problème de ce coté la, tout ce fai correctement. Avec l’image en noir et blanc tout ce fai correctement jusqu’au deuxième appel de RedessineImageZone, ensuite l’image s’affiche tjs avec tout ce qui est dessin dessus, mais les dessins dessus passent en nuance de gris au lieu de garder la couleur. Avec la même image (exectement identique visuellement) mais passé en couleur sous paint, tout marche impeccable.

Merci de l’aide, la je débauche donc si tu poste je ne répondrai pas avant demain. J’vai allé voir le lien avant et bonne soirée.
Merci encore

Donc si je comprend bien

  • au premier coup tu charges une image monochrome, tu fais tes traitements => tout est OK
  • au deuxième coup tu charges une autre image et tes traitements s’affiche en nuance de gris.

La deuxième image est chargée de la même manière que la première?

Pas tout a fait,
J’utilise la même image monochrome,

  • dans un 1er temps, j’utilise l’image monochrome telle qu’elle est, je fais mon traitement, mes rectangles, mes arcs de cercles s’affichent comme il faut en couleur, puis au moment ou je relance RedessineImageZone pour rafraichir la fenetre, toutes mes formes géométriques perdent la couleur et ne sont plus affiché qu’en nuance de gris.
  • dans un 2ème temps, j’ai modifié les propriétés de l’image sous paint pour qu’elle soit considéré comme une image couleur(en fait, j’ai juste mis un pixel en couleur puis je l’ai effacé) et j’ai utilisé le même code avec cette image et tout marche comme il faut.

J’en déduis donc qu’il faudrai que j’arrive juste apres mon loadimage à lui dire de faire comme si c’était une image couleur.En tout cas dans les 2 cas aucune ligne de code n’a changé, juste le chemin d’acces de l’image dans loadimage.

C’est ça le problème vient de là. Entre une image couleur et monochrome n’a pas la même taille et format. Dans le premier cas ca marche parce que tu as modifié celui-ci. ( Y RGB par exemple) alors qu’une image monochrome (Y et une matrice de nivo de gris)

Et comment il faut que je fasse pour changer le format dans le programme? C’est ça que je n’ai pas trouvé

Peux modifier l’implémentation de loadImage?

J’croi que sur le loadimage, j’ai déja tout essayé, enfin je pense je suis peut-être passé à coté de quelque chose

Peux tu mettre son implémentation? car je pense que tu ne dois pas avoir le même retour selon l’image que tu mets. (taille mémoire)
Edité le 22/02/2008 à 11:29

Le problème vien du format de l’image, je pourrai créer une image couleur de même dimension et, pour chaque pixel, recopier l’information d’instensité de l’image N&B sur chacun des trois cannaux de l’image couleur. Mais il doit bien y avoir une fonction toute faite pour faire ça ou en tout cas pour arriver au meme résultat.

J’peu rien faire avec loadImage que modifier les paramètres, c’est une fonction de gdi, et j’pense avoir modifié tout ce qui étai modifiable dans les paramètres