PIL打开BytesIO对象时报UnidentifiedImageError无法识别图片问题
问题根因
- 你对
io.BytesIO的用法存在误解:io.BytesIO接收的参数是图片本身的二进制数据,而非本地文件路径编码后的字节。你当前代码中把路径字符串编码后传入io.BytesIO,生成的流里存储的是路径文本的字节,根本不是图片内容,因此PIL无法识别为合法图片,触发UnidentifiedImageError。 - 去掉
str.encode后报错的原因是io.BytesIO本身只接受字节类型的输入,直接传入字符串类型的路径自然会触发类型错误,两个报错本质都是用法逻辑错误。
解决方法
分两种使用场景选择即可:
场景1:仅读取本地图片展示
无需额外调用io.BytesIO,直接把本地路径传入Image.open即可,代码最简:
from PIL import Image img1 = Image.open('D:/Downloads/imagens/0b4d4db99a7b8ecba24909d277556de8.png') img1.show()
场景2:确实需要通过字节流处理图片(比如后续要处理网络下载的图片字节、内存中生成的图片等)
先读取本地图片的二进制内容,再传入io.BytesIO生成流对象:
import io from PIL import Image # 以二进制模式读取本地图片内容 with open('D:/Downloads/imagens/0b4d4db99a7b8ecba24909d277556de8.png', 'rb') as f: img_binary = f.read() file = io.BytesIO(img_binary) img1 = Image.open(file) img1.show()
内容的提问来源于stack exchange,提问作者Rafael Rocha
相关产品推荐
相关产品推荐

