modifier des pixels sur un bitmap VC++

modifier des pixels sur un bitmap VC++ - C++ - Programmation

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.
 

Reply

Marsh Posté le 23-04-2004 à 22:38:52   

Reply

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.


Message édité par christophe_d13 le 24-04-2004 à 10:38:47
Reply

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.
 

Reply

Marsh Posté le 24-04-2004 à 12:40:56    

Je vais pas faire ton code à ta place non !
Ben si...

Code :
  1. hDC = GetDC ( NULL );
  2.     hDC_Bmp = CreateCompatibleDC ( hDC );
  3.     hBmpOld = (HBITMAP)SelectObject ( hDC_Bmp, hBitmap );
  4.     ReleaseDC ( NULL, hDC );
  5.     SetDIBits ( hDC_Bmp, hBmp, 0, abs(ly), Buffer, &BitmapInfo, DIB_RGB_COLORS );
  6.     SelectObject ( hDC_Bmp, hBmpOld );
  7.     DeleteDC ( hDC_Bmp );


 
La désection n'est pas forcément nécessaire puisque le hDC sera détruit...


Message édité par christophe_d13 le 24-04-2004 à 12:42:06
Reply

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.
 
 
 
 
 
 
 

Reply

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

Reply

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.
 


Message édité par christophe_d13 le 24-04-2004 à 14:42:36
Reply

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 :
  1. void CopieZoneHDCVersSprite ( HDC hDC, long x, long y, unsigned long * pBuffer, long cx, long cy )
  2. {
  3. HBITMAP hBitmap_Travail;
  4. HDC  hDC_Travail;
  5. BITMAPINFO BitmapInfo;
  6. //Création de la zone de travail
  7. hDC_Travail     = CreateCompatibleDC ( hDC );
  8. hBitmap_Travail = CreateCompatibleBitmap ( hDC, cx, cy );
  9. SelectObject ( hDC_Travail, hBitmap_Travail );
  10.    
  11. //Copie de la zone de l'écran vers la zone de travail
  12. BitBlt ( hDC_Travail, 0, 0, cx, cy, hDC, x, y, SRCCOPY );
  13. //On récupère la zone de travail en mode ARGB
  14. memset ( &BitmapInfo, 0, sizeof(BITMAPINFO) );
  15.     BitmapInfo.bmiHeader.biBitCount      = 32;
  16.     BitmapInfo.bmiHeader.biClrImportant  = 0;
  17.     BitmapInfo.bmiHeader.biClrUsed       = 0;
  18.     BitmapInfo.bmiHeader.biCompression   = BI_RGB;
  19.     BitmapInfo.bmiHeader.biHeight        = -cy;
  20.     BitmapInfo.bmiHeader.biWidth         = cx;
  21.     BitmapInfo.bmiHeader.biPlanes        = 1;
  22.     BitmapInfo.bmiHeader.biSize          = sizeof(BITMAPINFOHEADER);
  23.     BitmapInfo.bmiHeader.biSizeImage     = 0;
  24.     BitmapInfo.bmiHeader.biXPelsPerMeter = 0;
  25.     BitmapInfo.bmiHeader.biYPelsPerMeter = 0;
  26.     BitmapInfo.bmiColors[0].rgbRed       = 0xFF;
  27.     BitmapInfo.bmiColors[0].rgbGreen     = 0xFF;
  28.     BitmapInfo.bmiColors[0].rgbBlue      = 0xFF;
  29.     BitmapInfo.bmiColors[0].rgbReserved  = 0;
  30.     GetDIBits ( hDC_Travail, hBitmap_Travail, 0, cy, pBuffer, &BitmapInfo, DIB_RGB_COLORS );
  31. DeleteDC ( hDC_Travail );
  32. DeleteObject ( hBitmap_Travail );
  33. }


 

Code :
  1. HBITMAP         Convertion_BUFFER_HBITMAP ( unsigned long * Buffer, long lx, long ly )
  2. {
  3.     HBITMAP         hBmp, hBmpOld;
  4.     HDC             hDC, hDC_Bmp;
  5.     BITMAPINFO      BitmapInfo;   
  6.     if (Buffer==NULL) return NULL;
  7.     //Initialisation des données DI Bits
  8.     memset ( &BitmapInfo, 0, sizeof(BITMAPINFO) );
  9.     BitmapInfo.bmiHeader.biBitCount     = 32;
  10.     BitmapInfo.bmiHeader.biClrImportant = 0;
  11.     BitmapInfo.bmiHeader.biClrUsed      = 0;
  12.     BitmapInfo.bmiHeader.biCompression  = BI_RGB;
  13.     BitmapInfo.bmiHeader.biHeight       = ly;
  14.     BitmapInfo.bmiHeader.biWidth        = lx;
  15.     BitmapInfo.bmiHeader.biPlanes       = 1;
  16.     BitmapInfo.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
  17.     BitmapInfo.bmiHeader.biSizeImage    = 0;
  18.     BitmapInfo.bmiHeader.biXPelsPerMeter = 0;
  19.     BitmapInfo.bmiHeader.biYPelsPerMeter = 0;
  20.     BitmapInfo.bmiColors[0].rgbRed      = 0xFF;
  21.     BitmapInfo.bmiColors[0].rgbGreen    = 0xFF;
  22.     BitmapInfo.bmiColors[0].rgbBlue     = 0xFF;
  23.     BitmapInfo.bmiColors[0].rgbReserved = 0;
  24.                                              
  25.     hDC = GetDC ( NULL );
  26.     hDC_Bmp = CreateCompatibleDC ( hDC );
  27.     hBmp = CreateCompatibleBitmap ( hDC, lx, abs(ly) );
  28.     hBmpOld = (HBITMAP)SelectObject ( hDC_Bmp, hBmp );
  29.     ReleaseDC ( NULL, hDC );
  30.     SetDIBits ( hDC_Bmp, hBmp, 0, abs(ly), Buffer, &BitmapInfo, DIB_RGB_COLORS );
  31.     //Libération des ressources
  32.     SelectObject ( hDC_Bmp, hBmpOld );
  33.     DeleteDC ( hDC_Bmp );
  34. //    free ( Buffer );
  35.     return hBmp;
  36. }


Message édité par christophe_d13 le 24-04-2004 à 14:44:55
Reply

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.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed