GetDIBitsの使用方法
1929 ワード
最近、リモートコントロールに関するプラグインを作っていると、画面画像を取得して各画素点のRGB色を取り出すときに問題が発生しました.以下、簡単にコードを書きます.
皆さんはネット上で話している知識点と結びつけて、自分が完成する機能を完成することができます.
bitmapBitsはスクリーンのマトリクス画像データを保存し、次に圧縮転送したりBMPファイルのフォーマットに従って1枚の画像に保存したりします.
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枚の画像に保存したりします.