QPainter drawImage 变得非常像素化
QPainter drawImage becomes very pixelated
我使用 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);
下面是绘制的飞机图片。一张是在程序运行开始时截取的,另一张是几分钟后截取的。
您的问题之一是您首先重新缩放图像然后旋转它。
旋转需要从旧像素中插入新像素。输入的分辨率越高,插值的质量越好。重新缩放操作后,您的 SVG 质量完全丧失。
您面临的第二个问题是您使用了 "fast"(默认)转换方法。此方法不抗锯齿。因此,不是从多个输入像素进行插值,而是只采用一个最佳拟合。使用第二个参数 Qt::SmoothTransformation
调用 transformed()
并使用第二个参数 Qt::SmoothTransformation |
Qt::KeepAspectRatio` 调用 scaled()
将大大改善您的结果。
然而,它也更慢,因为在其原始的、更高分辨率的图像上执行旋转也是如此。
可以说,解决您的问题的最佳方法是采用不同的方法。您不应将 SVG 加载到基于光栅的图像 QImage 中,而应使用矢量图形。因此,SVG 首先以正确的方向和比例呈现。一个好的起点是 SVG 查看器示例:http://doc.qt.io/qt-5/qtsvg-svgviewer-example.html
我使用 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);
下面是绘制的飞机图片。一张是在程序运行开始时截取的,另一张是几分钟后截取的。
您的问题之一是您首先重新缩放图像然后旋转它。 旋转需要从旧像素中插入新像素。输入的分辨率越高,插值的质量越好。重新缩放操作后,您的 SVG 质量完全丧失。
您面临的第二个问题是您使用了 "fast"(默认)转换方法。此方法不抗锯齿。因此,不是从多个输入像素进行插值,而是只采用一个最佳拟合。使用第二个参数 Qt::SmoothTransformation
调用 transformed()
并使用第二个参数 Qt::SmoothTransformation |
Qt::KeepAspectRatio` 调用 scaled()
将大大改善您的结果。
然而,它也更慢,因为在其原始的、更高分辨率的图像上执行旋转也是如此。
可以说,解决您的问题的最佳方法是采用不同的方法。您不应将 SVG 加载到基于光栅的图像 QImage 中,而应使用矢量图形。因此,SVG 首先以正确的方向和比例呈现。一个好的起点是 SVG 查看器示例:http://doc.qt.io/qt-5/qtsvg-svgviewer-example.html