modifier des pixels sur un bitmap VC++ - C++ - Programmation
Marsh Posté le 24-04-2004 à 10:38:12
2 possibilités :
1 - Utiliser les fonctions SetPixel et GetPixel lié au hBitmap.
2 - Tranférer le hBitmap dans un tampon, faire le traîtement dans ce dernier puis retransférer vers un hBitmap (selon la lourdeur traîtement, c'est plus rapide).
hBitmap vers un tampon
Créer un hDC lié au hBitmap et utiliser la fonction GetDIBits
Tampon vers un hBitmap
Créer un hDC lié au tampon et utiliser la fonction GetDIBits ou mieux SetDIBitsToDevice
Sous Win32, ne jamais oublier de déselectionner et/ou détruire les objects créer.
Marsh Posté le 24-04-2004 à 12:24:42
Merci.
hBitmap vers un tampon :
-pour lier un hdc au hBitmap on utilise SelectObject(hdc,hBitmap);
mais c koi linitialisation de hdc ?
HDC hdc;
hdc=CreateCompatibleDC(GetDC(NULL)); ???
ou
hdc=CreateCompatibleDC(hdlg); ???
sachant que hdlg c'est le handle de la fenetre ou s'affiche l'image.
- meme question pour lié un hdc au tampon
la je vois pas du tout komen faire ca.
Marsh Posté le 24-04-2004 à 12:40:56
Je vais pas faire ton code à ta place non !
Ben si...
Code :
|
La désection n'est pas forcément nécessaire puisque le hDC sera détruit...
Marsh Posté le 24-04-2004 à 13:49:09
Merci.
Cke tu ma donné c pour mettre les bits du buffer
dans le handle du bitmap ?
pour mettre le hbitmap dan le tampon(la 1ere etape) ,voici mon code , je c pa trop cke je fé mais ca a l'air de marcher.
/********* HBmp To Buffer ***************/
void __stdcall HBmpToB()
{
BITMAPINFO bminfo;
bminfo.bmiHeader.biSize=sizeof(BITMAPINFO);
bminfo.bmiHeader.biWidth=1280;
bminfo.bmiHeader.biHeight=1024;
bminfo.bmiHeader.biPlanes=1;
bminfo.bmiHeader.biBitCount=24;
bminfo.bmiHeader.biCompression=BI_RGB;
bminfo.bmiHeader.biSizeImage=0;
bminfo.bmiHeader.biXPelsPerMeter=0;
bminfo.bmiHeader.biYPelsPerMeter=0;
bminfo.bmiHeader.biClrUsed=0;
bminfo.bmiHeader.biClrImportant=0;
ImgBits= (unsigned char *)malloc((1280*1024*3)*sizeof(unsigned char) );
HDC hdctmp ;
hdctmp=CreateCompatibleDC(NULL);
SelectObject(hdctmp, hbmp);
GetDIBits(
hdctmp, // handle to device context
hbmp, // handle to bitmap en global
0, // first scan line to set in destination bitmap
1024, // hauteur de limage
ImgBits, // buffer en global en unsigned char 1280*1024*3
&bminfo, // address of structure with bitmap data
DIB_RGB_COLORS // RGB or palette index
);
DeleteDC(hdctmp);
}
/********* Buffer To hbmp ***************/
void __stdcall BToHBmp()
{
BITMAPINFO bminfo;
// meme init ke dans la procedure precedente
// mais je le met pa c trop gros
HDC hDC,hDC_Bmp;
HBITMAP hBmpOld;
hDC = GetDC ( NULL );
hDC_Bmp = CreateCompatibleDC ( hDC );
hBmpOld = (HBITMAP)SelectObject ( hDC_Bmp, hbmp );
ReleaseDC ( NULL, hDC );
SetDIBits (
hDC_Bmp,
hbmp, // mon handle sur le bitmap en global
0,
1024,
ImgBits, // mon buffer avec tous les bits du bitmap
&bminfo,
DIB_RGB_COLORS
);
SelectObject ( hDC_Bmp, hBmpOld );
DeleteDC ( hDC_Bmp );
}
tout ca ca compile impec et avec ma fct pour afficher le hbmp dans la
fenetre ca l'affich ossi.
Mais kan je veux changer des truc dans le buffer (ImgBits) il me raffich la meme cet enculé alor ke c en global.
je suis un peu perdu la. ca se trouve je raconte de la merde
infiniment reconnaissant pour l'aide que vous pouvez mapporter.
Marsh Posté le 24-04-2004 à 13:52:48
fo pas faire attention au malloc dans la 1ere fct , je lai mis la parce ke jarriv pa a la foutre en global g des erreur de merde mas par contre ImgBits est déclaré en global mais il accepte pa le malloc en dehors des fct
Marsh Posté le 24-04-2004 à 14:39:42
Tu es sûr que tu changes bien le contenu de ton buffer... Ton code semble bon.
Cela dit, je te conseille de faire SetDIBitsToDevice, d'utiliser un buffer sur 32 bits, cela sera plus rapide.
Je te conseille aussi de faire des fonctions plus explicite du genre :
HBITMAP BufferToHBitmap ( DWORD * pdwBuffer, long lSizeX, long lSizeY );
et également
DWORD * HBitmapToBuffer ( HBITMAP hBitmap );
Un dernier point, si tu spécifie BitmapInfo.bmiHeader.biHeight en négatif pour la structure BITMAPINFO (uniquement), le remplissage se fera de haut en bas et pas de bas en haut.
Enfin, je te conseille de ne pas faire de GetDIBits et de toujours partir d'un tampon. Sauf si tu es obligés de le faire.
Marsh Posté le 24-04-2004 à 14:44:19
Des vieilles fonctions (je ne m'en sers plus, mais je sais qu'elles marchaient)... Elles datent un peu, mais à l'époque je débutait en dvlp sous Win32.
Code :
|
Code :
|
Marsh Posté le 24-04-2004 à 15:21:44
ok merci , finalmen c bon ca change bien le buffer c moi ki faisait dla merde et je v regarder pour listoire de haut en bas .
Merci enkore ca march impec , reste plus ka kje recupèr les pixel kon changé et bien les placer dans le buffer.
Marsh Posté le 23-04-2004 à 22:38:52
Je fais un programme ki affiche le buro de lotre (genre VNC).
-VISUAL C++ MFC et tout le bordel
-Bitmap 24 bits ( RGB)
-j'ai récupéré les coordonnées et la couleur de chak pixel ki a changé
jarrive a afficher un bitmap dans une nouvelle fenetre et ce ke je voudrais c'est modifier les pixels ki ont changé et a chak "timer" ke le programme affiche la nouvelle image .
plusieurs possibilités :
-mettre le bitmap dans 1 buffer et changer les pixels direct dans le buffer ( porcos et beaucoup tro lent).
-travailler avec le handle du bitmap (enfin je my connais pas trop la dedans). j'entends parler de BitBlt , SETDIBits mais j'arriv pas a les utiliser correctement pour faire cke je veux.
Merci pour votre éclairage sur ce problème.
Voir du code si vous avez déjà fait un programme similaire.