Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 来自pil对象的md5_Python_Md5_Python Imaging Library - Fatal编程技术网

Python 来自pil对象的md5

Python 来自pil对象的md5,python,md5,python-imaging-library,Python,Md5,Python Imaging Library,如何在不保存到文件的情况下获取pil对象的md5 imq.save('out.png') hash = hashlib.md5(open('out.png','rb').read()).hexdigest() 您可以将其写入一个StringIO,然后对其进行散列。您可以使用下面的PILImage类方法获取原始图像数据,以馈送到md5() im.getdata()=>序列 将图像的内容返回为 包含像素的序列对象 价值观序列对象是 展平,使第一行的值 紧跟在 第零行,依此类推 请

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

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

您可以将其写入一个
StringIO
,然后对其进行散列。

您可以使用下面的PIL
Image
类方法获取原始图像数据,以馈送到
md5()

im.getdata()=>序列

将图像的内容返回为 包含像素的序列对象 价值观序列对象是 展平,使第一行的值 紧跟在 第零行,依此类推

请注意,使用此生成的MD5散列不会与示例代码相同,因为它(至少部分)独立于用于保存图像的特定图像文件格式。如果您想独立于可能保存的特定图像文件格式来比较实际图像,这可能会很有用


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

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

正如参考的其他答案注释一样,如果PIL尝试自动检测输出格式,这可能会导致KeyError。要避免此问题,可以手动指定格式:

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

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

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

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

看起来.tostring()在2017年从2.0开始就被弃用,取而代之的是.tobytes()。tostring()不再受支持,请改用.tobytes()。当我尝试保存到
StringIO
BytesIO
对象时,我会得到一个
KeyError
,因为无法推断格式;提供已知格式会产生不同的错误。@FluxIX使用kwargs format='foo'避免KeyError(就像您可能做的那样)。你必须向任何人描述“不同的错误”才能帮助解决。我不是在寻求不同错误的帮助,只是将参数指定为关键字参数。@FluxIX好的,为了清楚起见,我已经包含了引用的其他答案提供的警告。我认为你的“提供一个已知的格式会产生不同的答案”意味着即使这样,解决方案仍然不适用于你。(现在我不知道该怎么想……这对您有用吗?)将参数指定为关键字参数确实有效。
hashlib.md5(img.tostring()).hexdigest()