Se connecter avec
S'enregistrer | Connectez-vous

api windows gdi c++, bmp monochrome->couleur?

Dernière réponse : dans Programmation
Partagez

les couleurs sont représentées par 3 paramètres. En monochrome, il n'y a plus qu'un paramètre. Le passage de la couleur au monochrome est donc une projection (au sens mathématique). Donc, tu ne peux pas retrouver les couleurs.

Non, je veu qu'elle reste en noir et blanc mais je voudrai que les propriétés de l'image passent en couleur.

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

Je n'ai pas compris.
Tu n'a pas des screen shot pour qu'on comprenne mieux ?
Ton analyse graphique, c'est quoi exactement ? des statistiques sur ton image ?

Mon analyse consiste juste à tracer des arcs de cercles de différentes couleurs sur mon image monochrome, mais je voudrai éviter de retracer mes arcs de cercle à chaque rafraichissement de la fenêtre donc j'incorpore directement mes tracés à l'image bitmap via mon context de mémoire mais, c'est la que j'ai un problème car mon image étant monochrome, je pred la couleur de mes tracés quand je les sauvegardes dans le context mémoire.

Ok, je comprends.
C'est normal tu utilises le contexte graphique de l'image. La bonne méthode c'est de faire l'affichage au rafraichissement d'écran (ce que tu veux éviter :)  ).
Maintenant, tu peux voir comment convertir le contexte graphique. Sinon, tu peux faire un autre contexte graphique et tu y copies ton image avec un bitblt
Posez votre question
Tom's guide dans le monde
  • Allemagne
  • France
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter