打印用Python的PIL打开的图像的md5哈希

时间:2014-06-09 18:32:39

标签: python md5 python-imaging-library

如何在PIL中打开图像,然后打印图像的md5哈希值而不将其保存到文件并读取文件?

4 个答案:

答案 0 :(得分:10)

您可以将图片保存为io.BytesIO(),并获取其值的md5哈希:

import hashlib
import Image
import io

img = Image.open(FILENAME)
m = hashlib.md5()
with io.BytesIO() as memf:
    img.save(memf, 'PNG')
    data = memf.getvalue()
    m.update(data)
print(m.hexdigest())

这将计算相同的md5哈希,就像将Image保存到文件中一样,然后将文件读入字符串并获取字符串的md5哈希值:

img.save(NEWFILE, 'PNG')
m = hashlib.md5()
data = open(NEWFILE, 'rb').read()
m.update(data)
print(m.hexdigest())

请注意,如果Image是从JPEG这样的有损格式加载的,那么您获得的md5哈希可能与您从原始文件本身获得的哈希值不同,不是只是因为上面的代码以PNG格式保存图像,但是因为即使将其重新保存为JPEG,保存为有损格式也会产生不同的数据。

答案 1 :(得分:3)

PIL/Pillow有一个Image方法tobytes(旧版本中为tostring),它会将图像像素值存储在字节字符串中。只需在返回的字节字符串上运行哈希算法。

这比编写PNG等特定格式更有效,因为它是内部使用的本机表示。

答案 2 :(得分:2)

from PIL import Image
import hashlib

md5hash = hashlib.md5(Image.open('test.png').tobytes())
print(md5hash.hexdigest())

答案 3 :(得分:1)

Re:评论:忽略exif,如何将数据复制到新的Image和md5中的字符串表示?

from PIL import Image
import md5

img = Image.open('test.png')
# assuming there is exif, if you should want it:
exif_data = img._getexif()
just_pixels = Image.new(img.mode, img.size)
just_pixels.putdata(img.getdata())

m = md5.new()
m.update(just_pixels.tostring())