MFC - 具有StretchDIBits的模糊/像素化BMP

时间:2013-10-08 02:11:14

标签: mfc

我正在使用StretchDIBits函数,在显示位图时,我可以看到它以两种不同的方式显示,如下所示:

Blurry BMP Pixel BMP

我唯一要做的就是每当我获得新数据时都要更新BMP缓冲区。

请在下面找到用于显示位图的相关代码。

if (pBMPBuffer)
{
    LPBITMAPINFO pBmpInfo;
    pBmpInfo = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];

    pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pBmpInfo->bmiHeader.biWidth = m_iZSize;
    pBmpInfo->bmiHeader.biHeight = m_iXSize;
    pBmpInfo->bmiHeader.biPlanes = 1;
    pBmpInfo->bmiHeader.biBitCount = 32;
    pBmpInfo->bmiHeader.biCompression = BI_RGB;
    pBmpInfo->bmiHeader.biSizeImage = m_iXSize * m_iZSize;
    pBmpInfo->bmiHeader.biXPelsPerMeter = 0;
    pBmpInfo->bmiHeader.biYPelsPerMeter = 0;
    pBmpInfo->bmiHeader.biClrUsed = 0;
    pBmpInfo->bmiHeader.biClrImportant = 0;

    SetStretchBltMode(pDC->m_hDC, STRETCH_HALFTONE);
    StretchDIBits(pDC->m_hDC,
                  rectBMP.left,
                  rectBMP.top,
                  rectBMP.Width(),
                  rectBMP.Height(),
                  0,
                  0,
                  m_iZSize,
                  m_iXSize,
                  pBMPBuffer,
                  pBmpInfo,
                  DIB_RGB_COLORS,
                  SRCCOPY);

    delete[] pBmpInfo;
}

我希望位图始终具有“模糊”外观。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用GDI +代替GDI,并选择在缩放或旋转图像时使用的双三次插值算法。 See Gdiplus::Graphics::SetInterpolationMode

请注意,GDI +将比GDI慢。另一种选择是使用OpenGL例如......