使用PIL处理图片时如何不保存到本地?Discord机器人开发相关问题
Discord机器人PIL生成图片无本地存储解决方案
你可以直接将生成的PIL图片写入内存缓冲区BytesIO而无需落地到本地磁盘,完全不会产生冗余文件,核心逻辑复用了你已经在使用的BytesIO内存读写方案,修改后的代码逻辑如下:
- 图片处理完成后,新建空的
BytesIO对象作为内存存储容器 - 调用PIL的
save方法将图片写入该内存对象,同时指定图片格式 - 调用
seek(0)将内存缓冲区的指针移到起始位置,避免读取到空内容 - 直接将内存对象传入
discord.File即可完成发送,无需填写本地路径
修改后可直接运行的代码如下:
# spongebob burning meme 无本地存储版本 # 如果你还没导入BytesIO先取消下一行的注释 # from io import BytesIO @client.command(name= "spongebob_burn") async def spongebob_burn(content, user: discord.Member = None): if user is None: user = content.author spongebob_burn = Image.open("memes/Spongebobburn.jpeg") asset = user.avatar_url_as(size=128) data = BytesIO(await asset.read()) pfp = Image.open(data) pfp = pfp.resize((74,74)) spongebob_burn.paste(pfp, (22,45)) # 替换原本地保存逻辑,直接写入内存 image_buffer = BytesIO() spongebob_burn.save(image_buffer, format='JPEG') image_buffer.seek(0) await content.send(file= discord.File(fp=image_buffer, filename="spongebob_meme.jpeg"))
补充说明:
- 如果你的梗图模板是带透明通道的PNG格式,把
save方法里的format='JPEG'改成format='PNG'即可 - 内存缓冲区会在发送完成后自动被回收,无需手动清理,也不会产生任何本地缓存文件
- 该方案相比本地存储少了磁盘IO开销,高并发场景下响应速度会更快
内容的提问来源于stack exchange,提问作者AnnaNutzz
相关产品推荐
相关产品推荐

