You can test that too.
from PyQt5.QtCore import QDir
from PyQt5.QtGui import QImage, QPalette, QPixmap
from PyQt5.QtWidgets import (QAction, QApplication, QFileDialog, QLabel,
QMainWindow, QMenu, QMessageBox, QScrollArea, QSizePolicy)
class ImageViewer(QMainWindow):
def __init__(self):
super(ImageViewer, self).__init__()
self.myimage = QImage()
self.filename = ""
self.scaleFactor = 1.778
self.imageLabel = QLabel()
self.imageLabel.setBackgroundRole(QPalette.Base)
mp = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
self.imageLabel.setSizePolicy(mp)
self.imageLabel.setScaledContents(True)
self.scrollArea = QScrollArea()
self.scrollArea.setBackgroundRole(QPalette.Shadow)
self.scrollArea.setWidget(self.imageLabel)
self.setCentralWidget(self.imageLabel)
self.createActions()
self.createMenus()
self.statusBar().showMessage("Welcome to Image Viewer")
self.setWindowTitle("Image Viewer")
w = 400
h = int(400 / self.scaleFactor)
self.resize(w, h)
self.move(0, 0)
def resizeEvent(self, event):
if not self.myimage.isNull():
self.updateView()
def updateView(self):
if self.scaleFactor < 1:
self.imageLabel.resize(self.height() * self.scaleFactor, self.height())
else:
self.imageLabel.resize(self.width(), round(self.width() / self.scaleFactor))
self.statusBar().showMessage(str(self.width()) + "x" + str(self.height()))
self.resize(self.imageLabel.width(), self.imageLabel.height())
def open(self):
fileName, _ = QFileDialog.getOpenFileName(self, "Open File",
QDir.homePath(), "Images (*.png *.xpm *.jpg *.bmp *.pdf)")
if fileName:
self.filename = fileName
self.loadFile(self.filename)
def loadFile(self, fileName):
if self.filename:
self.myimage = QImage(self.filename)
if self.myimage.isNull():
QMessageBox.information(self, "Image Viewer",
"Cannot load %s." % self.filename)
return
self.imageLabel.setPixmap(QPixmap.fromImage(self.myimage))
self.scaleFactor = int(self.myimage.width()) / int(self.myimage.height())
f = round(self.scaleFactor, 3)
self.statusBar().showMessage("Scale Factor: " + str(f), 3000)
if self.scaleFactor < 1:
self.resize(600 * self.scaleFactor, 600)
else:
self.resize(600, round(600 / self.scaleFactor))
def saveImage(self):
if not self.myimage.isNull():
fileName, _ = QFileDialog.getSaveFileName(self, "Save as PNG",
self.filename.replace(".jpg", ".png"), "Images (*.png)")
if fileName:
self.myimage.save(fileName, "PNG"); # write PNG
def saveImageJPEG(self):
if not self.myimage.isNull():
fileName, _ = QFileDialog.getSaveFileName(self, "Save as JPG",
self.filename.replace(".png", ".jpg"), "Images (*.jpg)")
if fileName:
self.myimage.save(fileName, "JPG"); # write JPG
def createActions(self):
self.openAct = QAction("&Open...", self, shortcut="Ctrl+O",
triggered=self.open)
self.saveAct = QAction("Save as PNG", self, shortcut="Ctrl+S",
triggered=self.saveImage)
self.saveAct2 = QAction("Save as JPG", self, shortcut="Ctrl+Shift+S",
triggered=self.saveImageJPEG)
self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q",
triggered=self.close)
def createMenus(self):
self.fileMenu = QMenu("&File", self)
self.fileMenu.addAction(self.openAct)
self.fileMenu.addAction(self.saveAct)
self.fileMenu.addAction(self.saveAct2)
self.fileMenu.addSeparator()
self.fileMenu.addAction(self.exitAct)
self.menuBar().addMenu(self.fileMenu)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
imageViewer = ImageViewer()
imageViewer.show()
if len(sys.argv) > 1:
print(sys.argv[1])
imageViewer.filename = sys.argv[1]
imageViewer.loadFile(imageViewer.filename)
sys.exit(app.exec_())