2

目標は、メモリ バッファーに格納されているビットマップを表示することです。メモリ バッファの内容は、ディスクに格納された .bmp ファイルと同じです。パフォーマンス上の理由から、これらのバッファをディスクに書き込んで表示することはできません。GDI+ もオプションではありません。現在、必要に応じて、メモリ バッファーから 1 ピクセルあたり 24 ビットのビットマップを表示できます。しかし、ピクセルあたり 8 ビットのビットマップを表示しようとすると、イメージが間違った色で表示されます (つまり、イメージ内の図は認識できます。スケーリング、方向などは正しいのに、すべてが間違った色になります)。

ビットマップヘッダー構造体を初期化する方法は次のとおりです。

bfh = *(tagBITMAPFILEHEADER*)buf1;
bih = *(tagBITMAPINFOHEADER*)(buf1+sizeof(tagBITMAPFILEHEADER));
rgb = *(RGBQUAD*)(buf1+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER));
bi.bmiColors[0] = rgb;
bi.bmiHeader = bih;
pPixels = (buf1+bfh.bfOffBits);

次に、HBITMAP を作成するいくつかの異なる方法を試しました。いくつかを次に示します。

    g_hBmp = CreateDIBitmap(dcPaint, &bih, CBM_INIT, (VOID *) pPixels, &bi, DIB_RGB_COLORS);

または:

g_hBmp = CreateDIBSection(dcPaint, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0);
SetDIBits(dcPaint, g_hBmp, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS);

また、さまざまなパラメーターを試しました。

  • CPaintDC オブジェクトの代わりに NULL
  • DIB_RGB_COLORS の代わりに DIB_PAL_COLORS

.bmp ファイル構造を格納するメモリ バッファーの内容をダンプし、LoadBitmap() でロードしたときに正しく表示されるディスクに格納された .bmp ファイルと同一であることを確認しました。

強調するために、上記のアプローチは 24 ビット/ピクセルの画像で機能します。ただし、1 ピクセルあたり 8 ビットの画像では機能しません。

前もって感謝します。

4

2 に答える 2

1

問題は、各ピクセル (つまり 24 ビット) の RGB 値CreateDIBSection()DIB_RGB_COLORS期待され、8 ビットのビットマップに RGB パレットへの 8 ビット インデックスであるピクセルが含まれていることですbi-bmiColors

そのため、前処理ステップで 8 ビット ビットマップを 24 ビットに変換するオプションがあります。たとえば、RGB 値にメモリを割り当て、元のパレットへのルックアップを実行してそれらの値を入力します。そうすれば、同じコードを使用して結果を表示できます。または、元のデータを使用して HBITMAP を作成し、それをメモリ DC に選択しBitBlt()てから、表示ウィンドウに選択することもできます。

GDI または GDI+ 以外の他のオプションとして、WIC (Windows Imaging Component) や Direct2D を検討することがあります。

于 2013-03-29T10:23:31.300 に答える
0

ハンスは、それbi.bmiColorsが正しく扱われていなかったと言うのは正しい. bi.bmiColorsテーブルを直接処理する代わりにpBitmapInfo、適切なオフセットを指定しBITMAPFILEHEADERてキャストするだけです。これにより、カラー テーブルが自動的に処理されます。はい、同じ場所を指していますpBitmapInfopBitmapInfoHeaderそれらが指すものは、ケースごとに異なる方法でキャストされます。これらのポインターは両方ともCreateDIBitmap()関数に必要です。

pBitmapFileHeader = (LPBITMAPFILEHEADER)buf1;
pBitmapInfoHeader = (LPBITMAPINFOHEADER)(buf1+sizeof(BITMAPFILEHEADER));
pBitmapInfo = (LPBITMAPINFO)(buf1+sizeof(BITMAPFILEHEADER));
pPixels = (buf1+pBitmapFileHeader->bfOffBits);

次に、OnPaint() で次のようにします。

g_hBmp = CreateDIBitmap(dcPaint, pBitmapInfoHeader, CBM_INIT, (VOID *) pPixels, pBitmapInfo, DIB_RGB_COLORS);
于 2013-04-20T00:46:11.723 に答える