我正在尝试将像素数组转换HBITMAP为本文中的指示: 如何将像素数组转换为HBITMAP.
基本上,数组被转换为a HBITMAP然后通过复制到剪贴板进行验证.但是,当BITMAP通过其bmBits成员从构造中访问位值时,它将返回NULL.
我可能在这里缺少一些东西.如果a HBITMAP成功创建,为什么我们仍然得到一个NULL指向其位值的指针?
uint8 width = 160;
uint8 height = 120;
uint8* pixels = new uint8[160 * 120 * 4];
for (int i = 0; i < 160 * 120 * 4; i++){
pixels[i] = (i % 4 == 1) * 255; // testing pixels
}
BITMAPINFOHEADER bmih;
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = width;
bmih.biHeight = -1 * height;
bmih.biPlanes = 1;
bmih.biBitCount = 32;
bmih.biCompression = BI_RGB;
bmih.biSizeImage = 0;
bmih.biXPelsPerMeter = 10;
bmih.biYPelsPerMeter = 10;
bmih.biClrUsed = 0;
bmih.biClrImportant = 0;
BITMAPINFO dbmi;
ZeroMemory(&dbmi, sizeof(dbmi));
dbmi.bmiHeader = bmih;
dbmi.bmiColors->rgbBlue = 0;
dbmi.bmiColors->rgbGreen = 0;
dbmi.bmiColors->rgbRed = 0;
dbmi.bmiColors->rgbReserved = 0;
HDC hdc = ::GetDC(NULL);
HBITMAP hbmp = CreateDIBitmap(hdc, &bmih, CBM_INIT, pixels, &dbmi, DIB_RGB_COLORS);
if (hbmp == NULL) {
::MessageBox(NULL, L"Could not load the desired image", L"Error", MB_OK);
return NULL;
}
::ReleaseDC(NULL, hdc);
// a little test if everything is OK
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbmp); // I can verify the image by pasting
CloseClipboard();
// verify the bitmap
BITMAP bitmap;
::GetObject(hbmp, sizeof(BITMAP), &bitmap);
uint8* lpbits = (uint8*)bitmap.bmBits;
assert(lpbits != NULL); // Why this assertion failed??
// cleanup
// DeleteObject(hbmp);
Run Code Online (Sandbox Code Playgroud)
答案在GetObject()文档中:
如果
hgdiobj是通过调用创建的位图的句柄CreateDIBSection,并且指定的缓冲区足够大,则该GetObject函数返回一个DIBSECTION结构.此外,包含在其中bmBits的BITMAP结构的成员DIBSECTION将包含指向位图的位值的指针.如果hgdiobj是手柄被任何其它装置创建的位图,
GetObject仅返回宽度,高度和颜色格式位图的信息.您可以通过调用GetDIBits()orGetBitmapBits()函数来获取位图的位值.
这意味着bmBits仅在查询DIBSECTION结构的DIB位图时才会填充该结构,其中包含BITMAP其他内容.
您正在查询BITMAP结构的DDB位图,因此bmBits不会填充,您必须单独检索像素位.
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |