为何PIL无法读取自身生成的字节数组?技术问询
解决PIL Image.tobytes()转字节后无法用BytesIO读取的问题
嘿,这个问题我之前也踩过坑,其实是对tobytes()方法的作用理解错啦~
问题根源
你用image.tobytes()拿到的只是图片的原始像素数据——就只是一堆像素值的集合,完全没有包含JPG文件的文件头、格式标识这些关键信息。相当于你只给了一堆颜料,却没告诉系统这是一幅JPG画,所以Image.open(BytesIO(...))根本识别不出这是个合法的图片文件,自然就抛出异常了。
而直接用open("image.jpg", "rb").read()读取的是完整的JPG文件字节流,里面包含了所有能让PIL识别格式的必要结构,所以能正常解析。
正确的实现方式
要把PIL Image对象转换成可以重新读取的字节流,得用BytesIO配合image.save()方法,这样才能生成包含完整文件结构的字节数据:
from io import BytesIO from PIL import Image # 读取原始图片 image = Image.open("image.jpg") # 创建一个BytesIO容器,把图片保存进去(指定格式为JPG) byte_stream = BytesIO() image.save(byte_stream, format='JPEG') # 重要:保存后指针会停在字节流末尾,需要移到开头才能正常读取 byte_stream.seek(0) # 现在可以正常读取并显示图片了 new_image = Image.open(byte_stream) new_image.show()
小补充
如果你的图片是PNG、GIF这类其他格式,只需要把format='JPEG'改成对应的格式就行,比如format='PNG'。要是不想手动指定,也可以省略这个参数,PIL会自动沿用原图片的格式进行保存。
内容的提问来源于stack exchange,提问作者Laimonas Sutkus
相关产品推荐
相关产品推荐

