1

画像をロードし、 ratioでスケーリングする単純なPyQt4アプリQPixmapを検討してください。

コードの重要な部分:

from PyQt4 import QtGui, QtCore
(...)
pixmap = QtGui.QPixmap("example.jpg")
pixmap = pixmap.scaled(1100, 1800, QtCore.Qt.KeepAspectRatio)

写真の回転が間違っているのを見て驚きました。

その理由は、写真にはEXIFカメラの位置に関する情報が含まれているためだと思います。これを考慮して回転を適用する必要があります。

$ exiftool example.jpg  | grep -i rot
Orientation                     : Rotate 270 CW
Auto Rotate                     : Rotate 270 CW
Rotation                        : 270

でこれを作成する方法はPyQt4、プログラムの元の短い形式に近いままです...できれば短くて甘くpythonicな方法ですか?

4

2 に答える 2

3

EXIF 情報を読み取って解析する方法が必要です。(Py)Qt にはその機能が組み込まれていません。pyexiv2しかし、EXIF.py、 、などの優れた Python ツールがありPyExifToolます。

回転角度を取得したら、次のように簡単に適用できますQPixmap

pixmap = pixmap.scaled(1100, 1800, QtCore.Qt.KeepAspectRatio)
pixmap = pixmap.transformed(QtGui.QTransform().rotate(angle))
于 2012-10-17T00:13:00.670 に答える
1

これは最も洗練されたアプローチではありませんが、私がexiftool使用するほとんどのシステムにインストールされていることがわかりましたが、パッケージpyexiv2は必ずしもそうではありません。

https://stackoverflow.com/a/10075210/544721exiftoolで提案されているラッパークラスを使用して使用しました(注:Py3kでラッパーを使用するには、変換のために適切な場所に追加する必要があります).encode().decode()str<->bytes

pixmap = QtGui.QPixmap('example.jpg')
with ExifTool() as e:
    exif_metadata = e.get_metadata('example.jpg')
    picture_orientation_code = exif_metadata[0]['EXIF:Orientation']
if picture_orientation_code == 8:
    pixmap = pixmap.transformed(QtGui.QTransform().rotate(270))
elif picture_orientation_code == 6:
    pixmap = pixmap.transformed(QtGui.QTransform().rotate(90))
pixmap = pixmap.scaled(1100, 1600, QtCore.Qt.KeepAspectRatio)

それでも-私はそれを最もエレガントだとは思いませんが、より良い解決策が現れるまで、この答えが他の読者に役立つことを願っています。

于 2012-10-17T22:40:24.493 に答える