来自Pillow的相同来源的不同图像数据

时间:2016-04-15 02:05:44

标签: python pillow

我目前正在移动一个脚本,从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 jessie:

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

LSH有些相似,但有足够的差异使它成为问题 两个系统的枕头版本是2.9.0。

是否有某种方法可以在debian系统上获得相同的像素值,就像我进入windows一样?
总的来说:有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

我个人不希望内部图像表示在不同的机器和/或操作系统之间必然是相同的 - 特别是如果其中一个是64位而另一个是32位。这是不能保证的,而且你正在计算MD5图像 - 你在两个系统上获得相同的文件MD5,所以如果你需要图像数据MD5,文件是相同的,那么你应该首先转换为已知特征的位图 - 然后MD5位图而不是“图像”。

答案 1 :(得分:0)

我"解决了#34;我的问题。
我偶然在Windows主机上安装了PILPillow 看起来它选择使用PIL版本 在debian机器上使用PIL之后,两台机器上的结果也相同 通常,升级PIL方使用Pillow会更明智,但在我的情况下,我需要生成与PIL版本完全相同的哈希值。

故事的故事: PILPillow在加载相同图片时可能会返回不同的图片数据。