Python 如何更好地实现图像缩放?
我有以下代码:Python 如何更好地实现图像缩放?,python,pyqt,pyqt5,qpixmap,Python,Pyqt,Pyqt5,Qpixmap,我有以下代码: from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QGroupBox, QLabel from PyQt5.QtGui import QPixmap from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt import sys class Window(QWidget
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QGroupBox, QLabel
from PyQt5.QtGui import QPixmap
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.imgLabel = QLabel(self)
pixmap = QPixmap("feedreader.jpg")
self.imgLabel.setPixmap(pixmap)
self.imgLabel.setAlignment(Qt.AlignCenter | Qt.AlignCenter)
self.imgLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
scroll = QScrollArea()
scroll.setWidget(self.imgLabel)
scroll.setWidgetResizable(True)
scroll.setFrameShape(QFrame.NoFrame)
self.zoomInButton = QPushButton('Zoom In', self)
self.zoomInButton.clicked.connect(self.onZoomIn)
self.zoomOutButton = QPushButton('Zoom Out', self)
self.zoomOutButton.clicked.connect(self.onZoomOut)
self.buttonGroup = QGroupBox()
vboxButtons = QVBoxLayout()
vboxButtons.addWidget(self.zoomInButton)
vboxButtons.addWidget(self.zoomOutButton)
vboxButtons.addStretch()
self.buttonGroup.setLayout(vboxButtons)
self.hbox = QHBoxLayout()
self.hbox.addWidget(scroll)
self.hbox.addWidget(self.buttonGroup)
self.setLayout(self.hbox)
self.init()
self.show()
def init(self):
self.scaleFactor = 1.0
def onZoomIn(self):
self.scaleImage(1.25)
def onZoomOut(self):
self.scaleImage(0.8)
def scaleImage(self, factor):
self.scaleFactor *= factor
pm = self.imgLabel.pixmap()
x = pm.width() * self.scaleFactor
y = pm.width() * self.scaleFactor
if x > 0 and y > 0:
pm = pm.scaled(x, y, Qt.KeepAspectRatio)
self.imgLabel.setPixmap(pm)
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
我能更好地实施它吗?当我缩小太多时,它会写
QPixmap::scaled: Pixmap is a null pixmap
我不能放大
当我在放大和缩小之间切换时,图像的质量
情况越来越糟
我从中获取了参数。它们可以吗?您应该使用已经实现了这些功能的QGraphicsView,而不是使用QLabel+QScrollara来实现许多任务,例如缩放:
from PyQt5 import QtWidgets, QtGui, QtCore
class ImageViewer(QtWidgets.QGraphicsView):
factor = 2.0
def __init__(self, parent=None):
super().__init__(parent)
self.setRenderHints(
QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform
)
self.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
self.setBackgroundRole(QtGui.QPalette.Dark)
scene = QtWidgets.QGraphicsScene()
self.setScene(scene)
self._pixmap_item = QtWidgets.QGraphicsPixmapItem()
scene.addItem(self._pixmap_item)
def load_image(self, fileName):
pixmap = QtGui.QPixmap(fileName)
if pixmap.isNull():
return False
self._pixmap_item.setPixmap(pixmap)
return True
def zoomIn(self):
self.zoom(self.factor)
def zoomOut(self):
self.zoom(1 / self.factor)
def zoom(self, f):
self.scale(f, f)
def resetZoom(self):
self.resetTransform()
def fitToWindow(self):
self.fitInView(self.sceneRect(), QtCore.Qt.KeepAspectRatio)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.view = ImageViewer()
self.setCentralWidget(self.view)
self.createActions()
self.createMenus()
self.resize(640, 480)
def open(self):
image_formats = " ".join(
[
"*." + image_format.data().decode()
for image_format in QtGui.QImageReader.supportedImageFormats()
]
)
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
self,
self.tr("Open Image"),
QtCore.QDir.currentPath(),
self.tr("Image Files({})".format(image_formats)),
)
if fileName:
is_loaded = self.view.load_image(fileName)
self.fitToWindowAct.setEnabled(is_loaded)
self.updateActions()
def fitToWindow(self):
if self.fitToWindowAct.isChecked():
self.view.fitToWindow()
else:
self.view.resetZoom()
self.updateActions()
def about(self):
QtWidgets.QMessageBox.about(
self,
"ImageViewer",
"ImageViewer",
)
def createActions(self):
self.openAct = QtWidgets.QAction(
"&Open...", self, shortcut="Ctrl+O", triggered=self.open
)
self.exitAct = QtWidgets.QAction(
"E&xit", self, shortcut="Ctrl+Q", triggered=self.close
)
self.zoomInAct = QtWidgets.QAction(
self.tr("Zoom &In (25%)"),
self,
shortcut="Ctrl++",
enabled=False,
triggered=self.view.zoomIn,
)
self.zoomOutAct = QtWidgets.QAction(
self.tr("Zoom &Out (25%)"),
self,
shortcut="Ctrl+-",
enabled=False,
triggered=self.view.zoomOut,
)
self.normalSizeAct = QtWidgets.QAction(
self.tr("&Normal Size"),
self,
shortcut="Ctrl+S",
enabled=False,
triggered=self.view.resetZoom,
)
self.fitToWindowAct = QtWidgets.QAction(
self.tr("&Fit to Window"),
self,
enabled=False,
checkable=True,
shortcut="Ctrl+F",
triggered=self.fitToWindow,
)
self.aboutAct = QtWidgets.QAction(self.tr("&About"), self, triggered=self.about)
self.aboutQtAct = QtWidgets.QAction(
self.tr("About &Qt"), self, triggered=QtWidgets.QApplication.aboutQt
)
def createMenus(self):
self.fileMenu = QtWidgets.QMenu(self.tr("&File"), self)
self.fileMenu.addAction(self.openAct)
self.fileMenu.addSeparator()
self.fileMenu.addAction(self.exitAct)
self.viewMenu = QtWidgets.QMenu(self.tr("&View"), self)
self.viewMenu.addAction(self.zoomInAct)
self.viewMenu.addAction(self.zoomOutAct)
self.viewMenu.addAction(self.normalSizeAct)
self.viewMenu.addSeparator()
self.viewMenu.addAction(self.fitToWindowAct)
self.helpMenu = QtWidgets.QMenu(self.tr("&Help"), self)
self.helpMenu.addAction(self.aboutAct)
self.helpMenu.addAction(self.aboutQtAct)
self.menuBar().addMenu(self.fileMenu)
self.menuBar().addMenu(self.viewMenu)
self.menuBar().addMenu(self.helpMenu)
def updateActions(self):
self.zoomInAct.setEnabled(not self.fitToWindowAct.isChecked())
self.zoomOutAct.setEnabled(not self.fitToWindowAct.isChecked())
self.normalSizeAct.setEnabled(not self.fitToWindowAct.isChecked())
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
确保
pm.width()*self.scaleFactor
和pm.height()。错误消息消失了,但由于缩放过多,我无法放大。您每次都需要缩放原始的pixmap,但无论如何,您提供的链接已经包含一个可工作的scaleImage函数…@eyllanesc我提供了一个可复制的小地图示例。如果你运行它,它就不会像我希望的那样运行。有时按钮没有反应,有时图像消失。