我在使用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;
}发布于 2012-10-16 14:48:55
问题不是来自StretchDIBits函数,而是这里用作位图的缓冲区的初始化。memset(...)函数被误用。使用诸如以下的初始化:
int Color = RGB(255, 0, 0);
for (int i = 0 ; i < 500 * 500 ; i++)
pBuffer[i] = Color;正如我所预期的那样,我得到了一个完美的蓝色图像。
发布于 2012-10-16 14:31:58
您必须使用以下模式
SetStretchBltMode(hdcWindow,HALFTONE);
而不是
SetStretchBltMode(dc.m_hDC, STRETCH_DELETESCANS);因为根据我的研究,半色调是最好的模式。
https://stackoverflow.com/questions/12908685
复制相似问题