2

24ビットのBMPファイルをRAMにロードしていて、このイメージファイルのHBITMAPを作成しようとしています。私が実験してきたいくつかの例を見つけましたが、うまくいかないようです。基本的に、ファイルのHBITMAPが必要です。これにより、ファイルをアンロードし、後でDeleteObject()で破棄できるHBITMAPを保持できます。このビットマップはアプリケーションの非常に早い段階で読み込まれるため、アプリケーションウィンドウがなく、HDCもありません。これは私がこれまでに持っているものです:-

HBITMAP cBitmap;  // This should be where my bitmap handle ends up.
mem;              // This is a void* pointer to the loaded BMP file


tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)mem;
tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(mem + sizeof(tagBITMAPFILEHEADER));
RGBQUAD rgb = *(RGBQUAD*)(mem + sizeof(tagBITMAPFILEHEADER) + sizeof(tagBITMAPINFOHEADER));

BITMAPINFO bi;
bi.bmiColors[0] = rgb;
bi.bmiHeader = bih;

UINT8* pixels = mem + bfh.bfOffBits;
void* ppv;
HBITMAP hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, &ppv, NULL, 0);
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pixels, &bi, DIB_RGB_COLORS);
GetObject(hBitmap, sizeof(BITMAP), &cBitmap);

なんらかの理由で、cBitmapはNULLになってしまいます。そして私を困惑させるもう1つのこと...DIB_RGB_COLORSは、BITMAPINFOがリテラルRGB値へのポインターを持っていることを意味しますが、パレットがない24ビット画像ではどのように機能しますか?

4

2 に答える 2

2

ディスクからファイルをロードする場合は、フラグを使用するのがおそらく最も簡単LoadImage()ですLR_LOADFROMFILE

すでにメモリにロードされているファイルからデータを作成するHBITMAPには、次のような操作を実行できます。

HBITMAP ConvertDibToHBitmap(void* bmpData)
{
    HBITMAP hBitmap = NULL;
    BOOL success = FALSE;

    // NOTE: Assumes the BITMAPFILEHEADER is present (not normally the case for
    // an in-memory DIB)
    LPBITMAPFILEHEADER bfh = (LPBITMAPFILEHEADER) bmpData;
    LPBITMAPINFOHEADER bih = (LPBITMAPINFOHEADER) (bfh + 1);
    void *pixels = (char*) (bih + 1); // NOTE: Assumes no color table (i.e., bpp >= 24)

    HDC hdc = GetDC(NULL);
    if (hdc != NULL) {
        hBitmap = CreateCompatibleBitmap(hdc, bih->biWidth, bih->biHeight);
        if (hBitmap != NULL) {
            HDC hdcMem = CreateCompatibleDC(hdc);
            if (hdcMem != NULL) {
                HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);
                if (StretchDIBits(hdcMem, 0, 0, bih->biWidth, bih->biHeight,
                        0, 0, bih->biWidth, bih->biHeight, pixels,
                        (LPBITMAPINFO) bih, DIB_RGB_COLORS, SRCCOPY) > 0)
                    success = TRUE;

                SelectObject(hdcMem, hOldBitmap);
                DeleteDC(hdcMem);
            }
        }

        ReleaseDC(NULL, hdc);
    }

    if (!success && hBitmap != NULL) {
        DeleteObject(hBitmap);
        hBitmap = NULL;
    }

    return hBitmap;
}
于 2013-02-28T14:31:22.497 に答える
1

ええと、それはどのようにGetObject機能するかではありません。使用法は

GetObject(handle, sizeof(object), &object);

あなたの場合、期待はあなたがそれを次のように呼ぶことです

BITMAP bitmap;
GetObject(hBitmap, sizeof(BITMAP), &bitmap);

構造体へのポインタを渡していないBITMAPため、動作は定義されていません。

まったく必要ありませんGetObject。あなたはすでにあなたを持っていますHBITMAP。それはhBitmap変数にあります。

cBitmap = hBitmap;
于 2013-02-28T17:22:48.273 に答える