【问题标题】:QPainter drawImage becomes very pixelatedQPainter drawImage 变得非常像素化
【发布时间】:2015-10-14 15:13:09
【问题描述】:

我使用 QPainter 和函数 drawImage 在地图上绘制飞机。每次飞机位置变化时都会重新绘制图像。问题是,一段时间后,图像变得非常像素化。我尝试使用高质量的 .svg,但也没有用。

下面是我的代码。有人可以发现错误在哪里,或者是什么导致图像如此像素化?

// Load .svg image
airplane->load("AirplaneTopDown.svg"); 
// Downsize image 
airplaneSmall = airplane->scaled(120, 120,Qt::KeepAspectRatio);
// Rotate image by trans
airplaneSmall = airplaneSmall.transformed(trans);
// Draw image and center at a certain screen position
painter.drawImage(airplaneX-airplaneSmall.width()/2,airplaneY-airplaneSmall.height()/2,airplaneSmall);

以下是绘制的飞机的图像。一张在程序运行开始时作为屏幕截图,另一张在几分钟后拍摄。

Airplane Airplane-pixelated

【问题讨论】:

    标签: qt drawimage qpainter


    【解决方案1】:

    您的一个问题是您首先重新缩放图像然后旋转它。 旋转需要从旧像素中插入新像素。输入的分辨率越高,插值的质量就越好。重新缩放操作后,您的 SVG 质量完全丧失。

    您面临的第二个问题是您使用“快速”(默认)转换方法。此方法不抗锯齿。因此,不是从几个输入像素进行插值,而是只需要一个最佳拟合。使用第二个参数Qt::SmoothTransformation 调用transformed() 和使用第二个参数Qt::SmoothTransformation |Qt::KeepAspectRatio` 调用scaled() 将大大改善您的结果。

    但是它也较慢,因为以原始的更高分辨率对图像执行旋转也是如此。

    可以说,解决您的问题的最佳方法是采用不同的方法。与其将 SVG 加载到基于光栅的图像 QImage 中,不如使用矢量图形。因此,SVG 首先以正确的方向和比例呈现。一个很好的起点是 SVG 查看器示例:http://doc.qt.io/qt-5/qtsvg-svgviewer-example.html

    【讨论】:

    • 抱歉回复晚了,非常感谢您的提示。我认为 SVG 查看器绝对是我现在可以尝试的。
    • 如果你认为答案不错,你应该接受它。 stackoverflow.com/help/someone-answers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2015-08-15
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多