freehair Posté(e) le 21 février 2008 Partager Posté(e) le 21 février 2008 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... Lien vers le commentaire Partager sur d’autres sites More sharing options...
PiFou86 Posté(e) le 21 février 2008 Partager Posté(e) le 21 février 2008 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 ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 21 février 2008 Partager Posté(e) le 21 février 2008 Ben pour chaque niveau de gris, tu tires une teinte et une saturation au pifomètre, et puis tu remplis comme ça Lien vers le commentaire Partager sur d’autres sites More sharing options...
PiFou86 Posté(e) le 21 février 2008 Partager Posté(e) le 21 février 2008 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 . Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 21 février 2008 Partager Posté(e) le 21 février 2008 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
freehair Posté(e) le 22 février 2008 Auteur Partager Posté(e) le 22 février 2008 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 22 février 2008 Partager Posté(e) le 22 février 2008 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
freehair Posté(e) le 22 février 2008 Auteur Partager Posté(e) le 22 février 2008 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
PiFou86 Posté(e) le 22 février 2008 Partager Posté(e) le 22 février 2008 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 !). Lien vers le commentaire Partager sur d’autres sites More sharing options...
freehair Posté(e) le 22 février 2008 Auteur Partager Posté(e) le 22 février 2008 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 More sharing options...
PiFou86 Posté(e) le 22 février 2008 Partager Posté(e) le 22 février 2008 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 More sharing options...
freehair Posté(e) le 22 février 2008 Auteur Partager Posté(e) le 22 février 2008 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 More sharing options...
Le Saigneur Sombre Posté(e) le 23 février 2008 Partager Posté(e) le 23 février 2008 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 More sharing options...
freehair Posté(e) le 25 février 2008 Auteur Partager Posté(e) le 25 février 2008 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 More sharing options...
16ar Posté(e) le 25 février 2008 Partager Posté(e) le 25 février 2008 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 ... :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.