2010-11-27 81 views
6

我怎样才能得到md5的pil对象而不保存到文件?md5从pil对象

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

回答

4

您可以改为将它写入StringIO,然后取其中的散列。

1

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

im.getdata()=>序列

返回一个图像的内容为包含像素 值的 序列对象。序列对象为 变平,以便第一行 的值紧跟在 行的值之后,依此类推。

注意,使用本不会的所得MD5哈希是相同的示例代码,因为它是(至少部分地)独立于用于保存图像的特定的图像文件格式的。如果要比较实际图像而不考虑可能保存的特定图像文件格式,该功能可能很有用。

要使用它,您需要将图像数据的MD5哈希存储在某个地方,而不管任何图像文件它可以在需要时进行检索 - 而不是通过将整个文件作为二进制数据读入内存来生成,就像问题中的代码一样。相反,您需要始终将映像加载到PIL中,然后使用其上的方法来计算散列。

5

谈到@伊格纳西奥的回答为代码,使用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”)

+0

当我尝试保存到任何一个`StringIO`或`BytesIO`对象,我得到一个'KeyError`因为格式无法推断;提供已知格式会产生不同的错误。 – FluxIX 2017-04-04 15:24:48

+0

@FluxIX避免使用kwargs format ='foo'的KeyError(正如你可能做的那样)。你必须描述任何人提供的“不同的错误”。 – 2017-04-04 16:36:12

12

其实有更简单的解决方案:

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