【问题标题】:Zoom QImage on QPixmap in QLabel在 QLabel 中的 QPixmap 上缩放 QImage
【发布时间】:2018-06-15 10:46:08
【问题描述】:

我是 QLabel 的子类,我在其上设置了 QPixmap。我想放大像素图中显示的图像(不损失质量)。我不想看到整个图像被放大,只是为了放大。

我尝试了很多方法来缩放像素图,但都无法获得好的结果。以下代码调整图像大小,但质量非常差。什么是正确的方法?

from PyQt5 import QtWidgets, QtCore, QtGui

class ImageLabel(QtWidgets.QLabel):

    def __init__(self, img):
        self.set_image(img)

    def set_image(self, image):
        qimg = QtGui.QPixmap.fromImage(image)
        self._displayed_pixmap = QtGui.QPixmap(qimg)
        # scale image to fit label
        self._displayed_pixmap.scaled(self.width(), self.height(), QtCore.Qt.KeepAspectRatio)
        self.setScaledContents(True)
        self.setMinimumSize(512, 512)
        self.show()

    def zoom_image(self):
        image_size = self._displayed_pixmap.size()
        image_size.setWidth(image_size.width() * 0.9)
        image_size.setHeight(image_size.height() * 0.9)
        self._displayed_pixmap = self._displayed_pixmap.scaled(image_size, QtCore.Qt.KeepAspectRatio)
        self.update()  # call paintEvent()

    def wheelEvent(self, event):
        modifiers = QtWidgets.QApplication.keyboardModifiers()
        if modifiers == QtCore.Qt.ControlModifier:
            self._zoom_image(event.angleDelta().y())

    def paintEvent(self, paint_event):
        painter = QtGui.QPainter(self)
        painter.drawPixmap(self.rect(), self._displayed_pixmap)

【问题讨论】:

  • 无法放大相同质量的图像。图像没有无限深度;他们有一个固定的分辨率。像谷歌地图这样的应用程序只会给人以相同质量放大的错觉。他们通过使用一堆具有不同分辨率的图像来实现这一点。这显然是一种非常昂贵的技术,因为放大得越多,覆盖同一区域所需的图像就越多。
  • PS:您可以尝试this answer 中的示例,看看它是否比您当前的代码提供了更好的结果。
  • @ekhumoro QGraphicsScene 对高分辨率图像很差:(

标签: python pyqt qimage qpixmap qlabel


【解决方案1】:

你可以试试这个: 当我将图片放入 PYQT 时,这对我有用

self._displayed_pixmap.scaled(self.width(), self.height(), QtCore.Qt.SmoothTransformation)

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多