You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:42:13