除了已经给出的好答案外,下面是一个例子,演示如何获取一个简单的数组结构进行遍历。(您可以使用例如Goz' code进行迭代。)
MSDN上的 GetDIBits 参考文献
您必须选择 DIB_RGB_COLORS
作为 uUsage
的标志,并设置BITMAPINFO
结构和它所包含的BITMAPINFOHEADER
结构。当您将 biClrUsed
和 biClrImportant
设置为零时,就没有颜色表,因此您可以将从 GetDIBits
得到的位图的像素读取为 RGB 值的序列。使用 32
作为位数(biBitCount
)会根据 MSDN 设置数据结构:
位图最多有 2^32 种颜色。如果 BITMAPINFOHEADER
的 biCompression
成员是 BI_RGB
,则 BITMAPINFO
的 bmiColors
成员为 NULL
。位图数组中的每个 DWORD
分别表示像素的蓝、绿和红的相对强度值。每个 DWORD
中的高字节未使用。
由于 MS 的 LONG
恰好为 32 位长(与 DWORD
的大小相同),因此您不必关注填充(如备注部分所述)。
代码:
HDC hdcSource = NULL;
HBITMAP hSource = NULL;
BITMAPINFO MyBMInfo = {0};
MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader);
if(0 == GetDIBits(hdcSource, hSource, 0, 0, NULL, &MyBMInfo, DIB_RGB_COLORS))
{
}
BYTE* lpPixels = new BYTE[MyBMInfo.bmiHeader.biSizeImage];
MyBMInfo.bmiHeader.biBitCount = 32;
MyBMInfo.bmiHeader.biCompression = BI_RGB;
MyBMInfo.bmiHeader.biHeight = abs(MyBMInfo.bmiHeader.biHeight);
if(0 == GetDIBits(hdcSource, hSource, 0, MyBMInfo.bmiHeader.biHeight,
lpPixels, &MyBMInfo, DIB_RGB_COLORS))
{
}
GetDIBits
之前;据我所知,在第一次调用后重新初始化是不必要的。 - dypbiHeight
可能是负数,这取决于原始DIB的内存布局。 - dyp