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

感谢@ekhuroo的帮助!以下代码有效:
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)`

最佳答案

您需要从图标(可以有多个图标)获取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)

07-28 02:26