我在使用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;
}
答案 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;
我得到了一个完美的蓝色图像。