Python: 将 QT QIcon 转换为 jpeg?
Python: convert QT QIcon into jpeg?
我正在编写一个照片整理应用程序,它使用 QListWidget 来显示照片文件的文件名和缩略图。我使用 QListWidget 的 QItem 的 QIcon 属性 来显示图像的缩略图。用户可以编辑 EXIF 数据和照片的文件名,然后将数据保存到图像文件中。 Jpg 可能还没有嵌入缩略图,所以我的应用程序允许用户将新生成的缩略图嵌入到 jpg 文件中。
我想检索 QIcon 图像并将其保存在原始照片文件元数据的 EXIF 部分。为此,我需要将 QIcon 图像转换为 jpeg 字节。我已经阅读了 QIcon 文档,但找不到从 QIcon 对象获取 jpeg byles 的方法。
我正在使用 Python 3 和 piexif 将 EXIF 数据写入文件。填充 QListWidget 时,我使用 PILLOW 创建 jpeg 缩略图。我可以在保存时使用 PILLOW 创建缩略图,但由于缩略图已经存在于 QIcon 中,因此使用 QIcon 图像会更有效率。
到目前为止,这是我的代码的本质。显然,这是行不通的,因为QIcon是QIcon对象,不是jpeg字节。 fileName
是一个包含图像文件完整有效路径的变量。 lstPhotos
是一个 QListWidget。
如有任何建议,我将不胜感激!
for i in lstPhotos:
exif_dict["thumbnail"] = i.icon()
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, fileName)
感谢@Ekhumoro 的帮助!以下代码有效:
def ConvertIconToJpeg(self, icon, size=None, fmt='JPG'):
if size is None:
size = icon.availableSizes()[0]
pixmap = icon.pixmap(size)
array = QtCore.QByteArray()
buffer = QtCore.QBuffer(array)
buffer.open(QtCore.QIODevice.WriteOnly)
pixmap.save(buffer, fmt)
buffer.close()
return array.data()'
然后在同一 class:
for i in lstPhotos.items():
thisThumbnail = exif_dict.pop("thumbnail")
if thisThumbnail is None:
thisThumbnail = self.ConvertIconToJpeg(i.icon())
exif_dict["thumbnail"] = thisThumbnail
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, fileName)`
您可以从您的 QIcon
中获取 QPixmap
,然后您可以将 QPixmap
保存为 JPEG。可能有更好的方法,但这是我现在能想到的。希望这对您有所帮助!
您需要从图标中获取像素图(可以有多个),然后将其保存到所需格式的缓冲区中:
def convert_icon(icon, size=None, fmt='JPG'):
if size is None:
size = icon.availableSizes()[0]
pixmap = icon.pixmap(size)
array = QtCore.QByteArray()
buffer = QtCore.QBuffer(array)
buffer.open(QtCore.QIODevice.WriteOnly)
pixmap.save(buffer, fmt)
buffer.close()
return array.data()
函数应该这样使用:
thumbnail = convert_icon(icon)
exif = piexif.load(path)
exif['thumbnail'] = thumbnail
data = piexif.dump(exif)
piexif.insert(data, path)
我正在编写一个照片整理应用程序,它使用 QListWidget 来显示照片文件的文件名和缩略图。我使用 QListWidget 的 QItem 的 QIcon 属性 来显示图像的缩略图。用户可以编辑 EXIF 数据和照片的文件名,然后将数据保存到图像文件中。 Jpg 可能还没有嵌入缩略图,所以我的应用程序允许用户将新生成的缩略图嵌入到 jpg 文件中。
我想检索 QIcon 图像并将其保存在原始照片文件元数据的 EXIF 部分。为此,我需要将 QIcon 图像转换为 jpeg 字节。我已经阅读了 QIcon 文档,但找不到从 QIcon 对象获取 jpeg byles 的方法。
我正在使用 Python 3 和 piexif 将 EXIF 数据写入文件。填充 QListWidget 时,我使用 PILLOW 创建 jpeg 缩略图。我可以在保存时使用 PILLOW 创建缩略图,但由于缩略图已经存在于 QIcon 中,因此使用 QIcon 图像会更有效率。
到目前为止,这是我的代码的本质。显然,这是行不通的,因为QIcon是QIcon对象,不是jpeg字节。 fileName
是一个包含图像文件完整有效路径的变量。 lstPhotos
是一个 QListWidget。
如有任何建议,我将不胜感激!
for i in lstPhotos:
exif_dict["thumbnail"] = i.icon()
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, fileName)
感谢@Ekhumoro 的帮助!以下代码有效:
def ConvertIconToJpeg(self, icon, size=None, fmt='JPG'):
if size is None:
size = icon.availableSizes()[0]
pixmap = icon.pixmap(size)
array = QtCore.QByteArray()
buffer = QtCore.QBuffer(array)
buffer.open(QtCore.QIODevice.WriteOnly)
pixmap.save(buffer, fmt)
buffer.close()
return array.data()'
然后在同一 class:
for i in lstPhotos.items():
thisThumbnail = exif_dict.pop("thumbnail")
if thisThumbnail is None:
thisThumbnail = self.ConvertIconToJpeg(i.icon())
exif_dict["thumbnail"] = thisThumbnail
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, fileName)`
您可以从您的 QIcon
中获取 QPixmap
,然后您可以将 QPixmap
保存为 JPEG。可能有更好的方法,但这是我现在能想到的。希望这对您有所帮助!
您需要从图标中获取像素图(可以有多个),然后将其保存到所需格式的缓冲区中:
def convert_icon(icon, size=None, fmt='JPG'):
if size is None:
size = icon.availableSizes()[0]
pixmap = icon.pixmap(size)
array = QtCore.QByteArray()
buffer = QtCore.QBuffer(array)
buffer.open(QtCore.QIODevice.WriteOnly)
pixmap.save(buffer, fmt)
buffer.close()
return array.data()
函数应该这样使用:
thumbnail = convert_icon(icon)
exif = piexif.load(path)
exif['thumbnail'] = thumbnail
data = piexif.dump(exif)
piexif.insert(data, path)