2016-04-15 17 views
0

現在、Windowsホストからの画像からローカルの敏感なハッシュを作成するスクリプトを、debianの画像に移動しています。
私の問題は、両方のプラットフォームで同じソース画像から異なる画像データを返すということです。
私はjpegのこの動作しか観察しませんでした。
テストケース:同じソースからの枕で異なる画像データ

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です。

私はWindowsのように、debianシステムで同じピクセル値を取得する方法はありますか?
一般的に、誰かがこれが起こっている理由を知っていますか?

+0

枕が両方のシステムでjpegファイルを正しく処理しているかどうかを確認するには、両方のシステムでデータを表示するか、pngに変換してからmd5を計算してみましたか? –

+0

@SteveBarnesちょうど試してみて、画像が正しく見えていて、pngへの変換が期待される結果を返しました(最初の画像では違い、2番目の画像でも同じです) – SleepProgger

答えて

0

私は自分の問題を "解決"しました。
私はPILPillowをウインドウのホストにインストールしました。
PILバージョンを使用するように選択されているようです。
debianマシンでPILを使用した後も、結果は両方のマシンで同じになります。
PIL側をPillowにアップグレードすることが一般的には賢明ですが、私の場合はPILバージョンで行ったのと全く同じハッシュを生成する必要があります。

同じ画像を読み込むときに、PILPillowが異なる画像データを返すことがあります。

1

個人的には、異なるマシン& /またはオペレーティングシステム間で内部イメージ表現が必ず同一であるとは思っていません。特に、そのうちの1つが64ビットであり、もう1つが32ビットである場合です。それは保証されておらず、イメージMD5を計算しているものです - 両方のシステムで同じファイルMD5を取得していますので、イメージデータMD5が必要な場合はファイルが同一であるため、既知の特性のビットマップに最初に変換する必要があります - 次に "image"ではなくビットマップをMD5に変換します。

関連する問題