如何通过Peasy-Pil在Discord.py的URL Embed中打开生成的图片?图片转URL求库推荐
解决方案
将PIL生成的图片转为可访问URL
你不需要额外安装特殊库,用Python内置的io模块配合requests就能实现,或者直接利用Discord的附件系统:
方法1:通过图床API上传字节流
- 把PIL图片转为内存字节流(无需保存到本地):
from io import BytesIO from PIL import Image # 假设img是你创建好的PIL图片对象 img_buffer = BytesIO() img.save(img_buffer, format="PNG") img_buffer.seek(0) - 用
requests将字节流上传到支持API的图床,获取返回的图片URL:import requests # 替换为目标图床的上传API地址 upload_endpoint = "图床API地址" files = {"image": ("output.png", img_buffer, "image/png")} resp = requests.post(upload_endpoint, files=files) image_url = resp.json()["data"]["url"] # 具体字段根据图床返回结构调整
方法2:利用Discord附件获取URL
如果不想依赖第三方图床,直接上传图片到Discord,从附件中提取URL:
from discord import File # 在Discord.py的命令/事件上下文里 file = File(img_buffer, filename="generated_image.png") msg = await ctx.send(file=file) image_url = msg.attachments[0].url
用Peasy-Pil在Discord.py的Embed中展示图片
Peasy-Pil的Canvas对象可以通过.image属性获取底层PIL图片,后续处理和普通PIL图片一致:
创建Peasy-Pil图片并转为字节流:
from peasy_pil import Canvas, Text from io import BytesIO # 创建画布并添加内容 canvas = Canvas((500, 200), color="#2c2f33") Text((250, 100), "Example Text", font_size=32, center=True).draw(canvas) pil_img = canvas.image # 转为内存字节流 img_buffer = BytesIO() pil_img.save(img_buffer, format="PNG") img_buffer.seek(0)在Embed中展示的两种方式:
- 方式1:通过Discord附件URL
from discord import Embed, File file = File(img_buffer, filename="peasy_image.png") embed = Embed(title="Generated Image") # 先发送文件获取URL,再更新Embed msg = await ctx.send(file=file) embed.set_image(url=msg.attachments[0].url) await msg.edit(embed=embed, attachments=[]) # 可选:移除原附件 - 方式2:使用图床URL
如果已经通过图床拿到了image_url,直接设置Embed的图片:embed = Embed(title="Generated Image") embed.set_image(url=image_url) await ctx.send(embed=embed)
- 方式1:通过Discord附件URL
内容的提问来源于stack exchange,提问作者Bohdan
相关产品推荐
相关产品推荐

