You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:53:28