Aller au contenu

api windows gdi c++


freehair

Messages recommandés

J've pas que les pixels de l'image change de couleur, mon problème ast que 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

Lien vers le commentaire
Partager sur d’autres sites

Ah, c'est juste un problème de format ?

Dans ce cas, la solution manuelle consiste à 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.

Effectivement, y a sans doute une fonction toute faite quelque part, mais vu que je ne pratique pas win32, je ne saurais te dire :sm:

Lien vers le commentaire
Partager sur d’autres sites

Et il n'y a aucun autre moyen de fusionner une image en couleur avec une image en noir et blanc sans perdre la couleur?

Avec quelle fonction je recopie les données de chaque pixel? je suis obligé de recreer aussi un autre context mémoire ou il ya moyen de copier directement d'une bitmap à une autre?

Lien vers le commentaire
Partager sur d’autres sites

Le problème c'est que je n'ai pas bcq d'info pour te répondre... Qu'est ce que ton hBmp_Memory ? une simple matrice de pixel en n&b ou rgv(a) suivant le context ?

Si c'est le cas, tu crées une matrice couleur pour dessiner dans ta fenetre. Tu ouvres ton image bmp et tu la copies dans ta matrice d'affichage. Si c'est une image couleur, tu fais une bete recopie (memcpy si c'est une simple matrice) sinon, tu itéres pour à partir d'une valeur en n&b (v) la convert en r = v, g = v, b = v (si c'est l'espace de couleur de ta matrice d'affichage !). Après tu fais ce que tu as à faire avec ton image (ie ta matrice représentant ton image couleur).

Au pire c'est c'est juste pour afficher une image, tu as tjs la bibliothèque d'image magick qui contient en plus moulte filtres.

Lien vers le commentaire
Partager sur d’autres sites

mon hBmp_Memory c'est le handle de mon image bitmap auparavant scanner en noir&blanc, donc si j'ai bien compris, j'dois creer un autre handle bitmap de couleur et je copie l'image original dedans (avec quel fonction?, j'dois faire une conversion ou pas, sachant que je ne ve pas changer la couleur des pixels de mon image originale?si oui, avec quel outil?)

J'suis désolé, j'suis un peu perdu mais j'y connai rien en api windows, c'est la première fois que j'ai à faire un plugin avec donc merci de votre aide .

Lien vers le commentaire
Partager sur d’autres sites

Le gris est un couleur dont le niveau de Rouge est égal au niveau de vert qui est égal au niveau de Bleu.

Pou transformer une image couleur en niveaude gris, il suffit de calculer la teinte correspondante à la couleur par la formule suivate teinte= 0.299 Rouge + 0.587* vert + 0.114* bleu.

Pour faire ta transformation, je te conseille la librairie GDI+ de microsoft, presente sur XP (et +) et installable sur 2000 (Elle permet de faire plein de choses...). Voila une extraction de mon code pour exemple :

using namespace Gdiplus;

// Creation et copie d'une image (Pour garder l'originale en mémoire...)

Bitmap* m_pclImage = ::new Bitmap (m_sFichierImage.AllocSysString());

Bitmap* m_pclImageRetraitee = m_pclImage->Clone(Rect(0,0,m_pclImage->GetWidth(),m_pclImage->GetHeight()), PixelFormat24bppRGB );

// La matrice de transformation

ColorMatrix matrix = {

0.299f, 0.299f, 0.299f, 0.0f, 0.0f,

0.587f, 0.587f, 0.587f, 0.0f, 0.0f,

0.114f, 0.114f, 0.114f, 0.0f, 0.0f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f,

0.0f, 0.0f, 0.0f, 0.0f, 1.0f };

// Recup du bitmap

Graphics* imageGraphics = Graphics::FromImage( m_pclImageRetraitee );

// Transformation

ImageAttributes imAtt; imAtt.SetColorMatrix( &matrix, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap );

// Pour dessiner l'image...

imageGraphics->DrawImage( m_pclImageRetraitee, Rect(0,0,W,H), 0,0,W,H, UnitPixel, &imAtt );

Et voila le boulot.

En esperant que ca va t'aider.

Lien vers le commentaire
Partager sur d’autres sites

Je ne peu pas utiliser la librairie GDI+ car mon plugin doit être un minimum portable et doit pouvoir fonctionner sur windows 98 par exemple. Est-ce que quelqu'un serai comment modifié le bitmapinfo et le bitmapinfoheader d'un bitmap?

Le gris est un couleur dont le niveau de Rouge est égal au niveau de vert qui est égal au niveau de Bleu.

Pou transformer une image couleur en niveaude gris, il suffit de calculer la teinte correspondante à la couleur par la formule suivate teinte= 0.299 Rouge + 0.587* vert + 0.114* bleu.

Je ne veu pas changer la couleur de mon image monochrome, je veu juste changer ses propriétés, je veux pouvoir rajouter de la couleur à cette image donc juste dier :"fais comme si cette image était en couleur" en gros.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...