如何将PIL.Image转换为IOBase类实现无硬盘存储发送二维码?
解决方案
要实现不保存到硬盘直接发送二维码,你需要将PilImage对象转换为BytesIO流,再用InputFile包装后发送,具体步骤如下:
完整代码示例
import qrcode from io import BytesIO from aiogram.types import InputFile # 生成二维码 qr_code_img = qrcode.make(message.text) # 将二维码写入BytesIO内存流 byte_stream = BytesIO() # 直接调用PilImage的save方法写入流,指定格式为PNG qr_code_img.save(byte_stream, format="PNG") # 将流指针移到起始位置,否则读取时会获取空内容 byte_stream.seek(0) # 包装为InputFile对象,可指定文件名让用户收到的图片有合理命名 input_file = InputFile(path_or_bytesio=byte_stream, filename="qrcode.png") # 发送二维码图片 await bot.send_photo(chat_id=message.from_user.id, photo=input_file)
关键说明
BytesIO是内存中的字节流,属于InputFile参数支持的IOBase类型,完全不需要写入硬盘即可传递图像数据。- 调用
save时必须明确指定图像格式(如PNG),因为PIL向字节流保存时无法自动推断格式。 - 写入流后必须执行
seek(0):写入操作会把流的指针移到末尾,不重置指针的话,后续读取(发送)操作会获取空内容。
内容的提问来源于stack exchange,提问作者Mr PeDoBeAr11
相关产品推荐
相关产品推荐

