GetDIBitsの使用方法

1929 ワード

最近、リモートコントロールに関するプラグインを作っていると、画面画像を取得して各画素点のRGB色を取り出すときに問題が発生しました.以下、簡単にコードを書きます.
HDC screenDC = CreateDC("DISPLAY", NULL, NULL, NULL);

HDC hMemDC = CreateCompatibleDC(screenDC);
//            ,     x,y            ,GetSystemMetrics      
//       HDC        ,        ,          
HBITMAP hBitmap = CreateCompatibleBitmap(screenDC, x, y);

BITMAPINFO bitmapInfo = {0};
//BITMAPINFO         ,   BITMAPINFOHEADER   RGBQUAD  ,
//BITMPINFOHEADER               ,     
//     biSize     BITMAPINFOHEADER     ,  GetDIBits                 
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
// hBitmap   hMemDC ,          , hMemDC       hBitmap  ,
//   hMemDC      hBitmap     ,                 
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
//StretchBlt  ,           hMemDC ,     MSDN,       
StretchBlt(hMemDC, 0, 0, x, y, screenDC, 0, 0, x, y, SRCCOPY);
//      GetDIBits  ,       NULL, bitmapInfo BITMAPINFOHEADER   biSize      ,
//         ,                bitmapInfo   ,        
//           。
GetDIBits(hMemDC, hBitmap, 0, y, NULL, &bitmapInfo, DIB_RGB_COLORS);
//        GetDIBits     ,   bitmapInfo                 
//         *           ,           ,          4   ,    0  。
// :  923     ,923/4 = 230(     ),      ,            ,  (230+1)*4 = 924          
unsigned char *bitmapBits = new unsigned char[bitmapInfo.bmiHeader.biSizeImage];
memset(bitmapBits, 0, bitmapInfo.bmiHeader.biSizeImage);//   0
//       ,                 ,
//     ,            RGB   16      bitmapBits ,
//         4   ,        --B,        --G,        --R,      
GetDIBits(hMemDC, hBitmap, 0, y, bitmapBits, &bitmapInfo, DIB_RGB_COLORS);
SelectObject(hMemDC, hOldBitmap);

//       
delete []bitmapBits;
DeleteObject(hBitmap);
DeleteDC(hMemDC);
DeleteDC(screenDC);

皆さんはネット上で話している知識点と結びつけて、自分が完成する機能を完成することができます.
bitmapBitsはスクリーンのマトリクス画像データを保存し、次に圧縮転送したりBMPファイルのフォーマットに従って1枚の画像に保存したりします.