来自pil对象的md5

时间:2010-11-27 22:43:30

标签: python md5 python-imaging-library

如何在不保存到文件的情况下获取pil对象的md5?

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

4 个答案:

答案 0 :(得分:14)

实际上有更简单的解决方案:

hashlib.md5(img.tostring()).hexdigest()

答案 1 :(得分:5)

将@ Ignacio的答案转换为代码,使用this answer来帮助:

import StringIO, hashlib

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

如引用的其他答案所述,如果PIL尝试自动检测输出格式,这可能会导致KeyError。要避免此问题,您可以手动指定格式:

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

(注意:我使用“img”作为变量,而不是我认为是“拼写错误”的“imq”。)

答案 2 :(得分:4)

你可以把它写成StringIO,然后把它的哈希值。

答案 3 :(得分:1)

您可以使用以下PIL Image类方法将原始图像数据提供给md5()

  

im.getdata()=>序列

     

以图像形式返回图像的内容   包含像素的序列对象   值。序列对象是   扁平化,使第一行的值   在值之后直接跟随   第零行,等等。

请注意,使用此生成的MD5哈希值不会与示例代码相同,因为它(至少部分地)与用于保存图像的特定图像文件格式无关。如果您想要比较实际图像而不依赖于它们可能保存的特定图像文件格式,这可能很有用。

要使用它,您需要将图像数据的MD5哈希值存储在某个位置,而不管任何图像文件可以在需要时检索它 - 而不是通过将整个文件作为二进制数据读取到内存中来生成它。你问题中的代码呢。相反,您需要始终将图像加载到PIL中,然后使用getdata()方法计算哈希值。