2016-04-15 3 views
0

В настоящее время я перемещаю скрипт, который создает локальные уязвимые хэши из изображений с хоста Windows на debian.
Моя проблема заключается в том, что Pillow возвращает разные данные изображения из одного и того же исходного изображения на обеих платформах.
Я наблюдал это поведение только для jpegs.
Тестовый пример:Различные данные изображения из того же источника с Pillow

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 

В LSHS несколько похожи, но отличается достаточно для того, чтобы быть проблематичным.
Версия для подушек на обеих системах - 2.9.0.

Есть ли способ получить такое же значение пикселя в системе debian, как и в Windows?
И вообще: Кто-нибудь знает, почему это происходит?

+0

Чтобы убедиться, что Pillow правильно обрабатывает файл jpeg на обеих системах, вы пытались отображать данные или преобразовывать их в png, а затем вычислять md5, в обеих системах? –

+0

@SteveBarnes Просто попробовал, и изображения выглядят правильно, и преобразование в png возвращает ожидаемые результаты (разные для первого изображения, то же самое для второго) – SleepProgger

ответ

0

Я «решил» свою проблему.
У меня были PIL и Pillow, установленные на хостах компьютеров случайно.
Похоже, что он использует версию PIL.
После использования PIL на машине debian тоже результаты на обеих машинах одинаковы.
Как правило, было бы разумнее обновить сторону PIL, чтобы использовать Pillow, но в моем случае мне нужно сгенерировать те же самые хэши, что и я, с версией PIL.

Мораль истории: PIL и Pillow могут возвращать различные данные изображения при загрузке одних и тех же изображений.

1

Я лично не ожидал, что внутреннее представление изображения обязательно будет идентичным между различными машинами. &/или Операционные системы - особенно если один из них 64 бит, а другой 32 бит. Это не гарантируется, и это то, что вы вычисляете на изображении MD5. Вы получаете тот же файл MD5 на обеих системах, чтобы файл был идентичным, если вам нужны данные изображения MD5, тогда вы должны сначала преобразовать в растровое изображение известных характеристик - то MD5 - растровое изображение, а не «изображение».

Смежные вопросы