From 0ec173d9bb310c1cb102e1ef71627179e42b3b2d Mon Sep 17 00:00:00 2001 From: andrey Date: Tue, 18 Aug 2020 16:59:58 +0300 Subject: [PATCH] improve ImageView quality --- pip | 2 +- qad/application/aboutwindow.ui | 3 +++ qad/widgets/image_view.cpp | 21 ++++++++++++++++----- qad/widgets/image_view.h | 1 + 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/pip b/pip index 31f0d88..9834ac1 160000 --- a/pip +++ b/pip @@ -1 +1 @@ -Subproject commit 31f0d881570880a73b6b4bdef5708de58570651d +Subproject commit 9834ac177bfae3f0bfa14c083e3857560ec59b38 diff --git a/qad/application/aboutwindow.ui b/qad/application/aboutwindow.ui index cd926fd..3167f51 100644 --- a/qad/application/aboutwindow.ui +++ b/qad/application/aboutwindow.ui @@ -28,6 +28,9 @@ + + QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing + diff --git a/qad/widgets/image_view.cpp b/qad/widgets/image_view.cpp index f50c0cd..57dc59f 100644 --- a/qad/widgets/image_view.cpp +++ b/qad/widgets/image_view.cpp @@ -14,6 +14,8 @@ ImageView::ImageView(QWidget * parent): QGraphicsView(parent) { setDragMode(QGraphicsView::NoDrag); setTransformationAnchor(QGraphicsView::AnchorUnderMouse); setScene(new QGraphicsScene()); + setRenderHint(QPainter::Antialiasing, true); + setRenderHint(QPainter::SmoothPixmapTransform, true); item.setTransformationMode(Qt::SmoothTransformation); item.setFlags(0); scene()->addItem(&item); @@ -28,12 +30,12 @@ ImageView::~ImageView() { QPixmap ImageView::pixmap() const { - return item.pixmap(); + return map; } void ImageView::setPixmap(QPixmap pixmap) { - item.setPixmap(pixmap); + map = pixmap; adjustView(); } @@ -42,12 +44,13 @@ void ImageView::setImage(const QImage & i) { im_data.clear(); if (i.isNull()) { item.setPixmap(QPixmap()); + map = QPixmap(); return; } QBuffer b(&im_data); b.open(QIODevice::ReadWrite); i.save(&b, "png"); b.close(); - item.setPixmap(QPixmap::fromImage(i)); + map = QPixmap::fromImage(i); adjustView(); } @@ -56,17 +59,18 @@ void ImageView::setImage(const QByteArray & i) { im_data = i; if (i.isEmpty()) { item.setPixmap(QPixmap()); + map = QPixmap(); return; } - item.setPixmap(QPixmap::fromImage(QImage::fromData(i))); + map = QPixmap::fromImage(QImage::fromData(i)); adjustView(); - } void ImageView::clear() { im_data.clear(); item.setPixmap(QPixmap()); + map = QPixmap(); } @@ -121,10 +125,17 @@ bool ImageView::eventFilter(QObject * o, QEvent * e) { void ImageView::adjustView() { + qreal mp = map.width() / map.size().boundedTo(size()).width(); + if (mp > 2) { + item.setPixmap(map.scaled(map.size()/mp, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + } else { + item.setPixmap(map); + } if (!autofit_) return; setSceneRect(item.boundingRect()); fitInView(&item, Qt::KeepAspectRatio); centerOn(&item); + } diff --git a/qad/widgets/image_view.h b/qad/widgets/image_view.h index 81ecadb..dbed10d 100644 --- a/qad/widgets/image_view.h +++ b/qad/widgets/image_view.h @@ -52,6 +52,7 @@ private: QByteArray im_data; QPoint prev_pos; bool autofit_; + QPixmap map; public slots: