How to convert an Array of pixels to HBITMAPの指示に従って、ピクセル配列をHBITMAP
に変換しようとしています。ビット配列をHBITMAPに変換した後にNULLポインタbmBits
基本的に、配列はHBITMAP
に変換され、クリップボードにコピーされて検証されます。しかし、BITMAP
構成要素のビット値にbmBits
メンバーでアクセスすると、NULL
が返されます。
ここに何か不足している可能性があります。 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);
呼び出しが失敗した理由を知るためにGetLastErrorを呼び出す - 少なくともあなたは手がかりを得る – pm100
@ pm100:ほとんどのGDI関数はエラー報告に 'GetLastError()'を使用しておらず、これは確かに使用されているGDI関数この例では(クリップボード関数のみが行います)。 –
@RemyLebeau十分に公正です。それで、「うまくいけないこと」以外のものを手に入れることはできません。しかし、根底にあるものが失敗した場合(ファイルエラー)、GetLastErrorは何かを返します。(赤い鳴き声かもしれませんが) – pm100