Pythonで画像を表示する、再々度

I wrote: 2016/11/20

またまたPythonで画像を表示するです。これで3回目です!

今回は画像を表示するのにいちいちファイルパスを書くのが面倒だと思うので、開くボタンでファイルダイアログを呼び出して、画像ファイルを選択する方法にしてみました。画像ファイルではない等の例外処理は全然やってないぞ!

それと画面サイズに合うように画像のスケールを変更してから、表示を行う仕組みにしました。少しは見やすいはずだと思う・・・

で、技術的な説明をすると、画像ファイルをQPixmapで読み込み、それでQGraphicsPixmapItemを作ります。それに対してQTransformでスケールを変更したのを反映させて画像表示という流れです。それとUIに関してはQt Designerで作ったのを使っています。

 


以下はソース。

# -*- coding: utf-8 -*-         
import sys
from PyQt4 import QtCore, QtGui, uic
from PyQt4.QtCore import *
from ui_sample import Ui_MainWindow

class Sample(QtGui.QMainWindow): 
    def __init__(self, pixmap, parent = None):
        super(Sample, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.view1_w = self.ui.view1.geometry().width();  # GraphicsViewの幅
        self.view1_h = self.ui.view1.geometry().height(); # GraphicsViewの高さ
        self.scene = QtGui.QGraphicsScene()
        self.item = QtGui.QGraphicsPixmapItem(pixmap)
        self.scene.addItem(self.item)
        self.ui.view1.setScene(self.scene)                # 空イメージを貼っておく
        QObject.connect(self.ui.button1, QtCore.SIGNAL('clicked()'), self.open)

    def open(self):
        dialog = QtGui.QFileDialog(self)
        dialog.setFileMode(QtGui.QFileDialog.AnyFile)
        if dialog.exec_() == 1:
            filename = dialog.selectedFiles()
            self.scene.removeItem(self.item)
            self.item = QtGui.QGraphicsPixmapItem(QtGui.QPixmap(filename[0]))
            self.setImage()

    def setImage(self):
        image_w = self.item.boundingRect().width()        # 画像のイメージの幅
        image_h = self.item.boundingRect().height()       # 画像のイメージの高さ
        transform = QtGui.QTransform()
        transform.scale(self.view1_w / image_w, self.view1_h / image_h)
        self.item.setTransform(transform)      
        self.scene.addItem(self.item)
        self.ui.view1.setFocus() 

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    pixmap = QtGui.QPixmap()   
    sample = Sample(pixmap)
    sample.show()
    sys.exit(app.exec_())

実行されたアプリケーション
photo1

photo2