首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用StretchDIBits时颜色错误

使用StretchDIBits时颜色错误
EN

Stack Overflow用户
提问于 2012-10-16 14:23:58
回答 2查看 950关注 0票数 0

我在使用StretchDIBits函数时遇到了问题。我想画一个用缓冲区制作的位图。但是,我在缓冲区中定义的颜色与屏幕上的结果不同。我已经阅读了文档,并且使用了BITMAPINFOHEADER的biCompression (BI_RGB和BI_BITFIELDS)和biClrUsed (0 / 3)参数。根据它们的值,我可以看到一些差异,但结果仍然与我预期的不同。

下面是我使用的代码(可以将它插入到一个模板SDI项目的OnDraw方法中来演示这个问题)。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-16 14:48:55

问题不是来自StretchDIBits函数,而是这里用作位图的缓冲区的初始化。memset(...)函数被误用。使用诸如以下的初始化:

代码语言:javascript
复制
int Color = RGB(255, 0, 0);

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

正如我所预期的那样,我得到了一个完美的蓝色图像。

票数 0
EN

Stack Overflow用户

发布于 2012-10-16 14:31:58

您必须使用以下模式

SetStretchBltMode(hdcWindow,HALFTONE);

而不是

代码语言:javascript
复制
SetStretchBltMode(dc.m_hDC, STRETCH_DELETESCANS);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12908685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档