QPainter :: drawPixmap()看起来不好而质量低?

时间:2016-04-27 15:26:47

标签: qt qwidget qpainter qpixmap qt5.5

我尝试使用QWidgetQPainter::drawPixmap()内绘制图标(.png)  :

QPixmap _source = "/.../.png";
painter.setRenderHint(QPainter::HighQualityAntialiasing);
painter.drawPixmap(rect(), _source);

但与QLabel(例如)和较小尺寸(在我的情况下为19 * 19)相比,结果并不完美。

我该怎么办?

**** ****编辑

带有pixmap @ size 19 * 19的

QLabel

enter image description here

我的画作@ size 19 * 19来自SmoothPixmapTransform渲染类型:

enter image description here

1 个答案:

答案 0 :(得分:8)

您正在设置错误的渲染提示,您需要QPainter::SmoothPixmapTransform才能顺利调整大小。默认情况下,使用最近邻方法,该方法速度快但质量很低,并且会对结果进行像素化。

QPainter::HighQualityAntialiasing用于绘制线条和填充路径等时,即在栅格化几何图形时,它对绘制光栅图形没有影响。

编辑:似乎只有SmoothPixmapTransform可以做到这么多,当最终结果如此微小时,它并不多:

  QPainter p(this);
  QPixmap img("e://img.png");
  p.drawPixmap(QRect(50, 0, 50, 50), img);
  p.setRenderHint(QPainter::SmoothPixmapTransform);
  p.drawPixmap(QRect(0, 0, 50, 50), img);
  img = img.scaled(50, 50, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
  p.drawPixmap(100, 0, img);

此代码产生以下结果:

enter image description here

第二张和第三张图像之间几乎没有任何区别,手动将源图像缩放到所需尺寸并绘制它会产生最佳效果。这肯定是不对的,期望从SmoothTransformation产生相同的结果,但由于某种原因,它的缩放比scale()的{​​{1}}方法要差。