使用StretchDIBits时颜色错误

时间:2012-10-16 06:23:58

标签: mfc

我在使用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;
}

2 个答案:

答案 0 :(得分:1)

您必须使用以下模式

SetStretchBltMode(hdcWindow,HALFTONE);

而不是

SetStretchBltMode(dc.m_hDC, STRETCH_DELETESCANS);

因为根据我的研究,半色调是最好的模式。

答案 1 :(得分:0)

问题不是来自StretchDIBits函数,而是来自此处用作位图的缓冲区的初始化。 memset(...)函数被滥用。 初始化如:

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

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

我得到了一个完美的蓝色图像。