2016-04-15 78 views
0

我目前正在移動一個腳本,從圖像從Windows主機創建本地敏感哈希到debian之一。
我的問題是Pillow從兩個平臺上的相同源圖像返回不同的圖像數據。
我只觀察jpegs的這種行爲。
測試用例:不同的圖像數據來自同一個來源與枕頭

from PIL import Image 
import md5 
import urllib2 
from cStringIO import StringIO 
urls = ("https://i.imgur.com/Mx6NQwM.jpg","https://i.imgur.com/MN1TKu5.png") 
print("VERSION %s" % Image.VERSION) 
for url in urls: 
    response = urllib2.urlopen(url).read() 
    img = Image.open(StringIO(response)).convert("RGB") 
    img_md5 = "".join("".join(map(chr, x)) for x in img.getdata()) 
    print("URL: %s" % url) 
    print("Plain md5:\t%s" % md5.new(response.read()).hexdigest()) 
    print("Image md5:\t%s" % md5.new(img_md5).hexdigest()) 

應該返回這兩個系統上相同的MD5哈希值。 我的結果:
的Windows 7:

VERSION 1.1.7 
URL: https://i.imgur.com/Mx6NQwM.jpg 
Plain md5: 4aacd5b92575ffca6d0ab884f95cc1f9 
Image md5: 10eaf568f4d9d33c722ea702fc4d1025 
URL: https://i.imgur.com/MN1TKu5.png 
Plain md5: d05e6dc1311339b806e5998f15fc818c 
Image md5: 38fc986c5cd9605038ee627b11687344 

Debian的傑西:

VERSION 1.1.7 
URL: https://i.imgur.com/Mx6NQwM.jpg 
Plain md5:  4aacd5b92575ffca6d0ab884f95cc1f9 
Image md5:  7347c6286f4d917649d967a5025e392e 
URL: https://i.imgur.com/MN1TKu5.png 
Plain md5:  d05e6dc1311339b806e5998f15fc818c 
Image md5:  38fc986c5cd9605038ee627b11687344 

的LSHS有些相似,但足以爲不同它是有問題的。
這兩個系統上的枕頭版本是2.9.0。

有什麼方法可以在debian系統上獲得相同的像素值,就像我在windows上得到的那樣?
而且一般來說:有人知道爲什麼會發生這種情況嗎?

+0

只是爲了確保枕頭在兩個系統上正確處理jpeg文件,您是否嘗試在兩個系統上顯示數據或將其轉換爲png,然後計算md5? –

+0

@SteveBarnes剛剛嘗試過,圖像看起來正確,並且轉換爲png返回了預期結果(第一張圖像不同,第二張圖像也一樣) – SleepProgger

回答

0

我「解決了」我的問題。
我偶然在windows主機上安裝了PILPillow
看起來它選擇使用PIL版本。
在debian機器上使用PIL後,兩臺機器上的結果也是一樣的。
通常,將PIL端升級爲Pillow會更明智,但在我的情況下,我需要生成與我在PIL版本中完全相同的哈希。

故事的士氣:PILPillow加載相同圖像時可能會返回不同的圖像數據。

1

我個人不希望內部圖像表示必須在不同的機器& /或操作系統之間是相同的 - 特別是如果其中一個是64位而另一個是32位。這是不能保證的,這是你正在計算圖像MD5 - 你在兩個系統上獲得相同的文件MD5,所以如果你需要圖像數據MD5,文件是相同的,那麼你應該首先轉換爲已知特徵的位圖 - 然後MD5位圖而不是「圖像」。

相關問題