1

考虑一个简单的PyQt4应用程序,加载图片QPixmap使用 ratio 缩放

代码的关键部分:

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 没有内置该功能。但是那里有很好的 Python 工具,比如pyexiv2, EXIF.py, 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不一定如此。

我使用exiftool了,通过使用以下建议的包装器类:https ://stackoverflow.com/a/10075210/544721(注意:为了将包装器与 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 回答