部分 StretchDIBits 时图像抖动
Posted
技术标签:
【中文标题】部分 StretchDIBits 时图像抖动【英文标题】:Image shaking when StretchDIBits partially 【发布时间】:2009-07-09 08:48:34 【问题描述】:我正在使用 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。现在问题发生了,图像在晃动!!
我对这个问题很恼火。 如何避免晃动?
【问题讨论】:
【参考方案1】:如果抖动来自整数舍入,请尝试将其向下舍入到最接近的整数。见this。
否则我会建议您切换到更容易使用的 GDI+。使用 GDI+,您可以绘制具有浮点精度的位图。请参阅文档Graphics::DrawImage。
我已经在几个 MFC Active-X 项目中从 GDI 切换到 GDI+,这并不难。
【讨论】:
【参考方案2】:这是我在 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);
【讨论】:
以上是关于部分 StretchDIBits 时图像抖动的主要内容,如果未能解决你的问题,请参考以下文章
视频抖动程度检测基于LK光流算法的视频图像序列抖动程度计算matlab仿真
抖动 (Floyd-Steinberg) 仅更新 p5.js 中的部分图形对象
203 dpi 上的 PrintDocument 图像需要抖动