0

StretchDIBits 関数の使用に問題があります。バッファから作成されたビットマップを描画したい。ただし、バッファーで定義した色は、画面上の結果とは異なります。ドキュメントを読み、BITMAPINFOHEADER の biCompression (BI_RGB および BI_BITFIELDS) および biClrUsed (0 / 3) パラメータで遊んでみました。値に応じていくつかの違いが見られますが、結果はまだ期待しているものとは異なります。

これが私が使用しているコードです (問題を示すために、テンプレート SDI プロジェクトの OnDraw メソッドに挿入できます)。

void CTestStretchDIBitsView::OnDraw(CDC* /*pDC*/)
{
    ...

    CClientDC dc(this);
    CRect rect;
    GetClientRect(&rect);

    DWORD* pBuffer = new DWORD[500 * 500];
    memset(pBuffer, RGB(255, 255, 0), 500 * 500 * sizeof(DWORD));

    LPBITMAPINFO pBmpInfo = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];

    pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pBmpInfo->bmiHeader.biWidth = 500;
    pBmpInfo->bmiHeader.biHeight = 500;
    pBmpInfo->bmiHeader.biPlanes = 1;
    pBmpInfo->bmiHeader.biBitCount = 32;
    pBmpInfo->bmiHeader.biCompression = BI_BITFIELDS;
    pBmpInfo->bmiHeader.biSizeImage = 500 * 500;
    pBmpInfo->bmiHeader.biXPelsPerMeter = 0;
    pBmpInfo->bmiHeader.biYPelsPerMeter = 0;
    pBmpInfo->bmiHeader.biClrUsed = 0;
    pBmpInfo->bmiHeader.biClrImportant = 0;

    SetStretchBltMode(dc.m_hDC, STRETCH_DELETESCANS);
    StretchDIBits(dc.m_hDC, 
                    0, 
                    rect.Height(), 
                    rect.Width(), 
                    -rect.Height(), 
                    0, 
                    0, 
                    500, 
                    500, 
                    pBuffer, 
                    pBmpInfo, 
                    DIB_RGB_COLORS, 
                    SRCCOPY);

    delete[] pBmpInfo;
    delete[] pBuffer;
}
4

2 に答える 2

1

次のモードを使用する必要があります

SetStretchBltMode(hdcWindow,HALFTONE);

それ以外の

SetStretchBltMode(dc.m_hDC, STRETCH_DELETESCANS);

私の調査によると、ハーフトーンが最適なモードだからです。

于 2012-10-16T06:31:58.000 に答える
0

この問題は、StretchDIBits 関数からではなく、ここでビットマップとして使用されるバッファーの初期化から発生しました。memset(...) 関数が誤用されました。次のような初期化を使用します。

int Color = RGB(255, 0, 0);

for (int i = 0 ; i < 500 * 500 ; i++)
    pBuffer[i] = Color;

期待どおり、完全に青い画像が得られます。

于 2012-10-16T06:48:55.097 に答える