Pythonで作るシンプル画像ビューワ

概要

画像をドラックアンドドロップすると表示するだけのソフトです。マウスホイールでズーム、マウス左クリックでドラッグするとパンできます。



ダウンロード

simple image viewer v0.1

NuitkaでWindows用にコンパイルしたデータです

ソースコード

github

バグ

  • どんなファイルでもDDできてしまう

課題

  • 回転機能を追加する
  • ウィンドウフレームの表示、非表示が出来るようにする



その他

PyQt5で画像を扱う練習のために作りました。シンプルと言いつつNuitkaでコンパイルした実行ファイルは起動に数秒程度の時間がかかるので使いたくないレベルです。Pythonのスクリプトを実行すると起動が早いので、スクリプトのままなら使ってもいいかなと思います。

ズームイン、ズームアウトの機能は下記リンクの内容参考に、スムーズなズームが出来るようにしています。

Smooth Zoom In QGraphicsView

上記をPythonに書き換えてMainwindowクラスには下記のようなメソッドを実装しました。

def wheelEvent(self, event):
    numDegrees = event.angleDelta().y() / 8
    numSteps = numDegrees / 15
    self._numScheduledScalings += numSteps
    if self._numScheduledScalings * numSteps < 0:
        self._numScheduledScalings = numSteps
    anim = QtCore.QTimeLine(350, self)
    anim.setUpdateInterval(20)
    anim.valueChanged.connect(self.scalingTime)
    anim.finished.connect(self.animFinished)
    anim.start()

def scalingTime(self, x):
    factor = 1.0 + float(self._numScheduledScalings) / 300.0
    self.ui.graphicsView.scale(factor, factor)

def animFinished(self):
    if self._numScheduledScalings > 0:
        self._numScheduledScalings -= 1
    else:
        self._numScheduledScalings += 1

マウスホイールが動いたときにwheelEventが呼び出されるので、Mainwindowのコンストラクタで下記のようにオーバーライドしています。

self.ui.graphicsView.wheelEvent = self.wheelEvent

中身はSmooth Zoom In QGraphicsViewに書いている通りですが、350msecで終了するQTimeLineを作成して、20msecごとにscalingTimeを呼び出します。scalingTimeではホイール移動量の勢いを計算して、ビューのスケールにセットしています。

動かしてみると割とスムーズに動いている感じがします。

コメント

タイトルとURLをコピーしました