2016-11-24 76 views
3

我在寫一個照片組織應用程序,它使用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)` 

回答

2

你需要從圖標的像素圖(可以有不止一個),然後保存到緩衝區中所要求的格式:

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

0

你可以從你QIcon得到QPixmap,那麼你就可以保存QPixmap爲JPEG。可能有更好的方法,但這是我現在能想到的。希望這可以幫助!

+0

謝謝!我會嘗試將'QPixmap'保存爲jpg格式。 – trinkner

+0

@trinkner不客氣,祝你好運:) –