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 回答