md5 от объекта Пил - PullRequest
       5

md5 от объекта Пил

7 голосов
/ 28 ноября 2010

как я могу получить md5 объекта pil без сохранения в файл?

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

Ответы [ 4 ]

14 голосов
/ 19 марта 2011

На самом деле есть более простое решение:

hashlib.md5(img.tostring()).hexdigest()
5 голосов
/ 28 ноября 2010

Превращение ответа @ Игнасио в код, используя этот ответ , чтобы помочь:

import StringIO, hashlib

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

Как указано в других примечаниях к ответу, это может привести к KeyError, если PIL попытается автоматически определить формат вывода. Чтобы избежать этой проблемы, вы можете указать формат вручную:

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

(Примечание: я использовал «img» в качестве переменной, а не ваш «imq», который я предположил, был опечаткой.)

4 голосов
/ 28 ноября 2010

Вместо этого вы можете записать его в StringIO, а затем взять его хеш.

1 голос
/ 28 ноября 2010

Вы можете использовать следующий метод класса PIL Image, чтобы получить необработанные данные изображения для подачи в md5().

im.getdata () => sequence

Возвращает содержимое изображения в виде объект последовательности, содержащий пиксель ценности. Объект последовательности сплющенный, так что значения для первой строки следовать сразу после значений нулевая строка и т. д.

Обратите внимание, что полученный хэш MD5 с использованием этого не будет таким же, как ваш пример кода, потому что он (по крайней мере частично) не зависит от конкретного формата файла изображения, используемого для сохранения изображения. Это может быть полезно, если вы хотите сравнить реальные изображения независимо от формата файла изображения, в котором они могут быть сохранены.

Чтобы использовать его, вам нужно будет хранить хэш MD5 данных изображения где-нибудь независимо от любого файла изображения, где он может быть извлечен при необходимости, а не генерировать его путем чтения всего файла в память в виде двоичных данных, таких как код в вашем вопросе делает. Вместо этого вам нужно будет всегда загружать изображение в PIL, а затем использовать для него метод getdata() для вычисления хэшей.

...