我使用QPainterdrawPixmap()
绘制了一幅图像,结果如下图B所示。
然后,我在 Windows 提供的图像查看器程序中打开同一张图片,并将其放大得更小,如下图A所示。
明显B比A大,但是没有A清晰,B有明显的混叠。
我尝试了setRenderHint(QPainter::Antialiasing)
一下setRenderHint(QPainter::SmoothPixmapTransform)
,有一定的效果,但不足以解决问题。
我尝试了不同的方式来显示同一幅图像(OpenGL、webEngine、QPainter.drawPixmap、graphicsView),结果各不相同,但它们的质量都低于 Windows 内置图像查看器。
我不认为这是图像清晰度的问题。当我使用 drawPixmap() 绘制图像并调用 QPainter 的 scale() 方法将其放大时,我可以看到图像的细节。
有人知道如何在 Qt 中绘制与内置 Windows 软件清晰度相同的图像吗?即使我缩小图像,我也想避免混叠问题。
- 编辑 -
最小可重现演示:
// canvaswidget.h
#ifndef CANVASWIDGET_H
#define CANVASWIDGET_H
#include <QWidget>
class CanvasWidget : public QWidget
{
Q_OBJECT
public:
explicit CanvasWidget(QImage img, QWidget *parent = nullptr);
void zoomIn();
void zoomOut();
signals:
protected:
QSize sizeHint();
void paintEvent(QPaintEvent *event) override;
void wheelEvent(QWheelEvent *event) override;
private:
qreal scale;
QPixmap pixmap;
};
#endif // CANVASWIDGET_H
// canvaswidget.cpp
#include "canvaswidget.h"
#include <QWheelEvent>
#include <QPainter>
#include <QPixmap>
CanvasWidget::CanvasWidget(QImage img, QWidget *parent)
: QWidget{parent}, scale(1.0)
{
// make sure high resolution source
pixmap = QPixmap::fromImage(img.scaled(img.size() * 10, Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
void CanvasWidget::zoomIn() {
scale = fmin(scale + 0.1, 10);
update();
}
void CanvasWidget::zoomOut() {
scale = fmax(scale - 0.1, 0.1);
update();
}
void CanvasWidget::paintEvent(QPaintEvent *event) {
if(!pixmap) {
return QWidget::paintEvent(event);
}
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
p.setRenderHint(QPainter::SmoothPixmapTransform);
p.drawPixmap(0,0,width() * scale,height() * scale, pixmap); // draw image
}
void CanvasWidget::wheelEvent(QWheelEvent *event)
{
if(event->modifiers() == Qt::ControlModifier) {
QPointF delta = event->angleDelta();
int v_delta = delta.y();
if(v_delta > 0) {
zoomIn();
} else {
zoomOut();
}
update();
adjustSize();
} else {
QWidget::wheelEvent(event);
}
}
QSize CanvasWidget::sizeHint()
{
return QSize(800,800);
}
下图左侧为本次演示的结果,右侧为Windows内置的图像查看器。
--- 编辑 2 ---
这是我在演示中使用的图像,它的格式是 PNG QImage::Format_ARGB32
,大小是QSize(1541, 1188)
25KB