すでに与えられた良い答えとは別に、単純な配列構造を取得する方法の例を次に示します。(反復には、たとえばGoz のコードを使用できます。)
GetDIBits リファレンス @ MSDN
DIB_RGB_COLORS
フラグとして選択し、構造とそれに含まれる構造uUsage
を設定する必要があります。とを 0 に設定すると、カラー テーブルが「存在しない」ため、取得したビットマップのピクセルをRGB 値のシーケンスとして読み取ることができます。as bit count ( )を使用すると、MSDN に従ってデータ構造がセットアップされます。BITMAPINFO
BITMAPINFOHEADER
biClrUsed
biClrImportant
GetDIBits
32
biBitCount
ビットマップには最大 2^32 色があります。biCompression
のメンバーが の場合、のメンバーBITMAPINFOHEADER
はです。ビットマップ配列のそれぞれは、ピクセルの青、緑、赤の相対強度をそれぞれ表します。それぞれの上位バイトは使用されません。BI_RGB
bmiColors
BITMAPINFO
NULL
DWORD
DWORD
MSLONG
は正確に 32 ビットの長さ ( のサイズDWORD
) であるため、パディングに注意を払う必要はありません (「備考」セクションで説明されているように)。
コード:
HDC hdcSource = NULL; // the source device context
HBITMAP hSource = NULL; // the bitmap selected into the device context
BITMAPINFO MyBMInfo = {0};
MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader);
// Get the BITMAPINFO structure from the bitmap
if(0 == GetDIBits(hdcSource, hSource, 0, 0, NULL, &MyBMInfo, DIB_RGB_COLORS))
{
// error handling
}
// create the pixel buffer
BYTE* lpPixels = new BYTE[MyBMInfo.bmiHeader.biSizeImage];
// We'll change the received BITMAPINFOHEADER to request the data in a
// 32 bit RGB format (and not upside-down) so that we can iterate over
// the pixels easily.
// requesting a 32 bit image means that no stride/padding will be necessary,
// although it always contains an (possibly unused) alpha channel
MyBMInfo.bmiHeader.biBitCount = 32;
MyBMInfo.bmiHeader.biCompression = BI_RGB; // no compression -> easier to use
// correct the bottom-up ordering of lines (abs is in cstdblib and stdlib.h)
MyBMInfo.bmiHeader.biHeight = abs(MyBMInfo.bmiHeader.biHeight);
// Call GetDIBits a second time, this time to (format and) store the actual
// bitmap data (the "pixels") in the buffer lpPixels
if(0 == GetDIBits(hdcSource, hSource, 0, MyBMInfo.bmiHeader.biHeight,
lpPixels, &MyBMInfo, DIB_RGB_COLORS))
{
// error handling
}
// clean up: deselect bitmap from device context, close handles, delete buffer