Python:将QT QIcon转换为jpeg?

3
我正在编写一个照片整理应用程序,它使用QListWidget显示照片文件的文件名和缩略图。我使用QListWidget的QItem的QIcon属性来显示图像的缩略图。用户可以编辑EXIF数据和照片的文件名,然后将数据保存到图像文件中。JPG文件可能没有内嵌的缩略图,因此我的应用程序允许用户将新生成的缩略图嵌入到JPG文件中。
我想获取QIcon图像并将其保存在原始照片文件的元数据的EXIF部分中。为此,我需要将QIcon图像转换为jpeg字节。我已经阅读了QIcon文档,但找不到从QIcon对象获取jpeg字节的方法。
我正在使用Python 3和piexif编写EXIF数据到文件中。我正在使用PILLOW创建jpeg缩略图来填充QListWidget。我可以在保存时使用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()'

然后在同一类中的一个例行程序中随后执行:

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)`
2个回答

2

您需要从图标中获取 pixmap(可能有多个),然后使用所需的格式将其保存到缓冲区中:

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)

这看起来很不错。我会试一下的。return语句应该返回缓冲区而不是数组吗?作为一个Python新手,对我来说,buffer语句所做的工作似乎不会反映在返回的数据中。或者我被搞混了吗?如果是这样,buffer语句如何影响数组? - trinkner
缓冲区将图像数据写入数组。该函数将数组中的数据作为Python bytes对象返回。 - 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()'和'thisThumb = self.ConvertIconToJpeg(i.icon(), 0, "JPG")
exif_dict["thumbnail"] = thisThumb exif_bytes = piexif.dump(exif_dict) piexif.insert(exif_bytes, fileName)'
- trinkner
抱歉上一条评论很简短,我必须在字符长度限制之下完成。非常感谢您的帮助! - trinkner
@ekumoro:我已经按照建议在我的原始问题上添加了文本,以便更清晰地表达。再次感谢。 - trinkner
非常感谢您提供的出色解决方案。它运行得非常好。 - trinkner

0
你可以从你的QIcon中获取一个QPixmap,然后将QPixmap保存为JPEG。可能有更好的方法,但这是我现在能想到的一个。希望这可以帮助你!

谢谢!我将尝试将QPixmap保存为jpg格式。 - trinkner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接