0

我正在使用 C++ GDI、StretchDIBits 在 DC 上绘制图像。

因为原始图像很大,需要高质量。我使用 HAFTONE 模式,在 DC 上绘制整个图像(缩放图像)似乎需要时间。

所以我决定使用 StretchDIBits 进行部分绘制。但是关于 StretchDIBits 有一个严重的问题。

我只能将整数中的矩形绘制到整数中的区域(宽度和高度,以及x,y的左上角都是整数)

    ::SetStretchBltMode(hdc, HALFTONE);
    ::StretchDIBits(hdc,
        realDrawRect.left, 
        realDrawRect.top, 
        realDrawRect.right - realDrawRect.left, 
        realDrawRect.bottom - realDrawRect.top,
        left, 
        top, 
        width, 
        height,
        pImageDIB,
        pImageHead, 
        DIB_RGB_COLORS, SRCCOPY);

如果,图像是 21 * 21 。我现在在 (20, 20, 60,60) 向 DC 画 (5, 5, 7, 7),下次我想在 (21, 20, 61, 60) 画。原图没有对应的位置。所以我只能画一个近似矩形到 DC。现在问题发生了,图像在颤抖!

我对这个问题很生气。我怎样才能避免晃动?

4

2 回答 2

0

如果抖动来自对整数的四舍五入,请尝试将其向下舍入到最接近的整数。看到这个

否则,我建议您切换到更易于使用的 GDI+。使用 GDI+,您可以绘制具有浮点精度的位图。请参阅文档Graphics::DrawImage

我已经在几个 MFC Active-X 项目中从 GDI 切换到 GDI+,而且一点也不难。

于 2009-07-09T09:09:32.200 回答
0

这是我在 C++ 和 C# 中使用stretchDIBits 时遇到的一个正常问题。为了克服这个问题,我们在调用stretchDIBits 功能之前具有校正图像宽度和高度的功能:

if (m_currentImage.Width % 2 != 0) // check for odd number
{
     if (((m_currentImage.Width - 1) / 2) % 2 != 0)
           m_currentImage = m_currentImage.Resize(m_currentImage.Width - 3, m_currentImage.Height - 2, Emgu.CV.CvEnum.Inter.Linear);
     else
           m_currentImage = m_currentImage.Resize(m_currentImage.Width - 1, m_currentImage.Height, Emgu.CV.CvEnum.Inter.Linear);
}
else if ((m_currentImage.Width / 2) % 2 != 0) // else check fraction of width is odd number
     m_currentImage = m_currentImage.Resize(m_currentImage.Width - 2, m_currentImage.Height - 1, Emgu.CV.CvEnum.Inter.Linear);
于 2019-02-02T21:50:26.417 回答