2010-11-27 82 views
6

我怎樣才能得到md5的pil對象而不保存到文件?md5從pil對象

imq.save('out.png') 
    hash = hashlib.md5(open('out.png','rb').read()).hexdigest() 

回答

4

您可以改爲將它寫入StringIO,然後取其中的散列。

1

您可以使用以下PIL Image類方法來獲取原始圖像數據以提供給md5()

im.getdata()=>序列

返回一個圖像的內容爲包含像素 值的 序列對象。序列對象爲 變平,以便第一行 的值緊跟在 行的值之後,依此類推。

注意,使用本不會的所得MD5哈希是相同的示例代碼,因爲它是(至少部分地)獨立於用於保存圖像的特定的圖像文件格式的。如果要比較實際圖像而不考慮可能保存的特定圖像文件格式,該功能可能很有用。

要使用它,您需要將圖像數據的MD5哈希存儲在某個地方,而不管任何圖像文件它可以在需要時進行檢索 - 而不是通過將整個文件作爲二進制數據讀入內存來生成,就像問題中的代碼一樣。相反,您需要始終將映像加載到PIL中,然後使用其上的方法來計算散列。

5

談到@伊格納西奧的回答爲代碼,使用this answer幫助:

import StringIO, hashlib 

output = StringIO.StringIO() 
img.save(output) 
hash = hashlib.md5(output.getvalue()).hexdigest() 

由於引用的其他答案指出,如果PIL嘗試自動檢測輸出格式這可能會導致一個KeyError異常。爲了避免這個問題,你可以手動指定格式:

img.save(output, format='GIF') 

(注:我用「IMG」作爲變量,而不是我認爲是一個錯字你「IMQ」)

+0

當我嘗試保存到任何一個`StringIO`或`BytesIO`對象,我得到一個'KeyError`因爲格式無法推斷;提供已知格式會產生不同的錯誤。 – FluxIX 2017-04-04 15:24:48

+0

@FluxIX避免使用kwargs format ='foo'的KeyError(正如你可能做的那樣)。你必須描述任何人提供的「不同的錯誤」。 – 2017-04-04 16:36:12

12

其實有更簡單的解決方案:

hashlib.md5(img.tostring()).hexdigest()