February 21, 200818 yr 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...
February 21, 200818 yr je veux bien comprendre comment tu penses passer d'une information n&b à une information couleur sachant que le n&b ne garde que l'intensité de la lumière !
February 21, 200818 yr Ben pour chaque niveau de gris, tu tires une teinte et une saturation au pifomètre, et puis tu remplis comme ça
February 21, 200818 yr Quand le pifomètre peut donner de l'art ! Remarque... en faisant une segmentation de l'image n&b et en associant une couleur à chaque région en la mixant avec le lumière... ca pourrait faire des trucs à la Albert Einstein .
February 21, 200818 yr J'avoue transformer uen image monochrome en couleur c'est pas facile comme question ^^' C'est ptete le surmenage d'api win32 qui amene a ce genre de réfléxion
February 22, 200818 yr Author 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->BITMAPDrawState(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
February 22, 200818 yr 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
February 22, 200818 yr Author Ben, j'y ai pensé mais c'est un peu lourd de recopier les pixels un par un, enfin merci quand même... Si des fois quelqu'un connai une fonction, hésitez surtout pas, j'aimerai vraiment savoir
February 22, 200818 yr ne connaissant pas l'api win32 je proposerais la meme solution que Iorinc. La copie n'est pas vraiment lourde tant qu'elle se fait offscreen (et de toute manière, c'est ce que feras l'api - en plus rapide soit !).
February 22, 200818 yr Author 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?
February 22, 200818 yr 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.
February 22, 200818 yr Author 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 .
February 23, 200818 yr 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.
February 25, 200818 yr Author 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.
February 25, 200818 yr Si c'est juste changer le format, tu peux etre utiliser CImg http://cimg.sourceforge.net/reference/stru..._1_1_c_img.html Sachant que Cimg, c'est juste un header a include ... :)
Archived
This topic is now archived and is closed to further replies.