QImage 抖动质量

3

我们目前在Windows上使用商业库进行图像渲染。当显示小于图像原始尺寸的单色图像时,该库会将图像转换为灰度,以便大部分图像仍然可以被识别:

enter image description here

现在我尝试在Qt 4.8应用程序中执行相同操作。基本上所做的是调用:

QImage mImage;
...
mImage.load(...);
...
painter.drawImage(paintRect, mImage, mImage.rect()); 

当paintRect小于mImage.rect()时,这个方法运行良好,但输出结果不够令人满意:

enter image description here

我尝试了几种renderHints(QPainter::SmoothPixmapTransform、Antialiasing、HighQualityAntialiasing),还使用以下方法转换了图像:

mImage = mImage.convertToFormat(QImage::Format_RGB32);

QPainter::SmoothPixmapTransform 似乎稍微改善了输出结果(在屏幕截图中包含)。其他所有的东西似乎都没有改变什么。

我有遗漏什么吗?

如何改善缩小尺寸后的图像显示质量?


你是否保持了纵横比?你尝试过使用QImage::scaled预缩放图像吗? - UmNyobe
保持纵横比:虽然我们的应用程序不需要,但在这些情况下我确实需要。没有预缩放,用户可以放大和缩小,因此缩放因子始终会发生变化。 - RED SOFT ADAIR
1个回答

5

在进行IT技术操作时,有可能会出现以下情况:

painter.drawImage(paintRect, mImage, mImage.rect()); 

当图片大小不同时,画家会插值选择初始图片中要采取哪个像素,这解释了第二张图片的原因。

使用比例手动缩放

QImage todraw = mImage.scaled(
            paintRect.size(),
            Qt::IgnoreAspectRatio,
            Qt::SmoothTransformation);
...
painter.drawImage(paintRect, todraw, mImage.rect()); 

你只在调整大小事件中计算图像todraw(以避免每次绘画事件都进行缩放),并将其与绘画工具一起使用。


2
确实这就是区别。太棒了。我认为这是一个错误。谢谢。 - RED SOFT ADAIR
1
@REDSOFTADAIR 这不是一个错误。QPainter::drawImage在图像重新缩放时不执行线性插值。它从来没有这种行为。您使用SmoothPixmapTransform无法正常工作,因为您没有使用像素图。您使用的抗锯齿设置没有效果,因为此问题与抗锯齿无关。 - Jason C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接