如何用Python实现Discord带背景图与用户头像信息的Embed消息?
实现带背景图、居中头像及用户名的Discord欢迎Embed
Discord原生Embed不支持直接在背景图上叠加元素,所以我们需要先合成一张包含背景、用户头像和用户名的图片,再将其嵌入到Embed中。以下是具体实现步骤:
1. 依赖安装
首先安装用于图片合成的Pillow库:
pip install pillow
2. 完整代码实现
替换你原有的on_member_join事件代码:
import discord from PIL import Image, ImageDraw, ImageFont import io import datetime @bot.event async def on_member_join(member): # 指定欢迎消息发送的频道 channel = bot.get_channel(你的频道ID) # 替换为实际频道数字ID # 加载背景图(替换为你的背景图本地路径) background = Image.open("welcome_bg.png").convert("RGBA") # 获取并处理用户头像 avatar_url = member.display_avatar.with_size(256) # 获取256x256尺寸的头像 avatar_data = await avatar_url.read() avatar = Image.open(io.BytesIO(avatar_data)).convert("RGBA") # 调整头像大小并居中放置 avatar_size = (200, 200) avatar = avatar.resize(avatar_size) avatar_pos = ( (background.width - avatar_size[0]) // 2, (background.height - avatar_size[1]) // 2 - 50 # 向上偏移预留用户名位置 ) background.paste(avatar, avatar_pos, avatar) # 带透明通道粘贴 # 添加用户名文字 draw = ImageDraw.Draw(background) # 加载字体(可替换为自定义字体路径,如"fonts/NotoSans.ttf") try: font = ImageFont.truetype("arial.ttf", 40) except: font = ImageFont.load_default() username = member.display_name # 计算文字居中位置 text_bbox = draw.textbbox((0,0), username, font=font) text_width = text_bbox[2] - text_bbox[0] text_pos = ( (background.width - text_width) // 2, avatar_pos[1] + avatar_size[1] + 20 # 头像下方20像素处 ) # 绘制带描边的文字,提升可读性 draw.text((text_pos[0]-1, text_pos[1]), username, font=font, fill="#000000") draw.text((text_pos[0]+1, text_pos[1]), username, font=font, fill="#000000") draw.text((text_pos[0], text_pos[1]-1), username, font=font, fill="#000000") draw.text((text_pos[0], text_pos[1]+1), username, font=font, fill="#000000") draw.text(text_pos, username, font=font, fill="#ffffff") # 将合成图转为Discord可发送的文件对象 img_byte_arr = io.BytesIO() background.save(img_byte_arr, format='PNG') img_byte_arr.seek(0) welcome_image = discord.File(img_byte_arr, filename="welcome.png") # 创建Embed并关联图片 embed = discord.Embed( description=f'欢迎 **{member.mention}** 加入服务器!', color=0xff55ff, timestamp=datetime.datetime.now() ) embed.set_image(url="attachment://welcome.png") embed.set_footer(text=f"第 {member.guild.member_count} 位成员") await channel.send(embed=embed, file=welcome_image)
3. 自定义调整建议
- 背景图:推荐使用宽800-1200px、高400-600px的图片,可根据实际需求调整头像和文字的位置参数。
- 字体:如果需要更美观的字体,将
arial.ttf替换为你的字体文件路径即可。 - 样式:可以修改头像大小、文字颜色、描边样式,适配你的服务器风格。
内容的提问来源于stack exchange,提问作者Efren Pineda
相关产品推荐
相关产品推荐

