使用Python的PIL打印图像的md5哈希值
我想知道怎么用PIL打开一张图片,然后直接打印出这张图片的md5哈希值,而不需要把它保存到文件里再去读取这个文件。
4 个回答
2
关于这个评论:如果想忽略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())
15
你可以把图片保存到一个叫做 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
,有损格式的保存会产生不同的数据。
22
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当你点击一个按钮时,程序就会做出反应。这种情况通常会用到“事件监听器”。
事件监听器就像是一个守卫,它一直在关注你程序中的某些事情,比如用户的点击、键盘输入或者其他动作。当这些事情发生时,事件监听器就会立刻通知程序去执行相应的代码。
举个例子,想象一下你在一个网页上有一个“提交”按钮。你希望用户点击这个按钮后,程序能处理他们输入的信息。你可以设置一个事件监听器,让它在用户点击按钮时运行特定的代码,这样就能实现你想要的功能。
总之,事件监听器帮助程序及时响应用户的操作,让程序变得更加互动和智能。
from PIL import Image
import hashlib
md5hash = hashlib.md5(Image.open('test.png').tobytes())
print(md5hash.hexdigest())