Python:将QT QIcon转换为jpeg?

Python:将QT QIcon转换为jpeg?

问题描述:

我在写一个照片组织应用程序,它使用QListWidget来显示照片文件的文件名和缩略图。我使用QListWidget的QItem的QIcon属性来显示图像的缩略图。用户可以编辑EXIF数据和照片的文件名,然后将数据保存到图像文件中。 Jpgs中可能没有嵌入缩略图,所以我的应用程序允许用户将新生成的缩略图嵌入到jpg文件中。Python:将QT QIcon转换为jpeg?

我想检索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()' 

,然后遵循常规后在同一类:

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)` 

你需要从图标的像素图(可以有不止一个),然后保存到缓冲区中所要求的格式:

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) 
+0

这看起来不错。我会试一试。 return语句应该返回缓冲区而不是数组?作为一个python noob,在我看来,'buffer'语句完成的工作不会反映在返回的数据中。还是我困惑?如果是这样,那么'buffer'语句如何影响数组? – trinkner

+0

缓冲区将图像数据写入数组。该函数将数组内的数据作为python“bytes”对象返回。 – ekhumoro

+0

仍然无法嵌入拇指。 '变形点焊ConvertIconToJpeg(个体,图标,大小=无,FMT =' JPG'): 如果尺寸是无: 尺寸= icon.availableSizes()[0] 的pixmap = icon.pixmap(大小) 阵列= QtCore .QByteArray() 缓冲液= QtCore.QBuffer(数组) buffer.open(QtCore.QIODevice.WriteOnly) pixmap.save(缓冲液,FMT) buffer.close() 返回的数组。数据() ' 和 ' thisThumb = self.ConvertIconToJpeg(i.icon(),0, “JPG”) exif_dict [ “缩略图”] = thisThumb exif_bytes = piexif.dump(exif_dict) piexif.insert( exif_bytes,fileName) – trinkner

你可以从你QIcon得到QPixmap,那么你就可以保存QPixmap为JPEG。可能有更好的方法,但这是我现在能想到的。希望这可以帮助!

+0

谢谢!我会尝试将'QPixmap'保存为jpg格式。 – trinkner

+0

@trinkner不客气,祝你好运:) –