Python使用Bottle框架结合Pillow动态返回图片到浏览器显示异常问题
错误原因
- 你代码中调用
img.tobytes()返回的是无格式封装的原始像素二进制数据,没有PNG文件必要的文件头、元数据信息,浏览器无法识别像素对应的尺寸、色彩通道等参数,所以只会显示尺寸错误的空白方块。 - 本地存储时调用的
img.save()方法会自动完成PNG格式编码、添加文件头等完整封装流程,所以本地生成的文件可以正常打开。
修复方案
将返回逻辑修改为直接把图片按PNG格式写入BytesIO流即可,不需要调用tobytes()方法,修改后的代码如下:
import io from PIL import Image, ImageDraw, ImageFont from bottle import response try: img = Image.open("images/template.png") draw = ImageDraw.Draw(img) font = ImageFont.truetype("fonts/arial.ttf", 40) draw.text((23, 62), "Text", "#000", font=font) response.content_type = 'image/png' # 初始化字节流 output_stream = io.BytesIO() # 直接将图片以PNG格式写入流 img.save(output_stream, format='PNG') # 将流指针重置到起始位置 output_stream.seek(0) return output_stream except OSError as exception: print(exception) pass
注意事项
- 调用
save()写入字节流时必须显式指定format='PNG'参数,否则Pillow会因为输出目标不是磁盘文件而无法自动推断输出格式。 - 返回前必须调用
seek(0)重置流的读指针,否则返回的流会从末尾开始读,返回空内容。
内容的提问来源于stack exchange,提问作者Vincent Decaux
相关产品推荐
相关产品推荐

