nonebot2——表情包生成插件

文章目录


前言

基于PIL,对已存有的表情包类型进行文字添加。需要下载包pillow。

通过对已定义的表情包模板,在群聊中进行表情包生成,插件下载在总结一栏。


一、导入

from PIL import Image, ImageDraw, ImageFont
import urllib.parse

二、效果

三、代码

1、图片生成

# 定义一个函数,从nonebot2机器人上获取两个信息,一个keys,一个text。keys为图片表情包类型,由于服务器上使用中文会出错,可以采用urllib.parse.quote(keys)进行转化,保证路径里的图片名称与keys转化后保持一致。text为你所要定义的文字。
# 注意,需要建立文件夹存储图片模板
def get_express_img(keys, text):
    keys = urllib.parse.quote(keys)
    path = f'/home/xiaochen/database/image/{keys}.jpg'

    im = Image.open(path)
    w, h = im.size
    # 导入文字字体,后面计算文字大小
    font = ImageFont.truetype(f'/home/xiaochen/database/Fronts/msyh.ttc', 25)  # 终端
    # 计算使用该字体占据的空间
    # 返回一个 tuple (width, height)
    # 分别代表这行字占据的宽和高
    t_w, t_h = font.getsize(text)
    # print(t_w, t_h)
    text_size = (w, t_h + 20)
    bg = Image.new('RGB', text_size, color='white')
    draw = ImageDraw.Draw(bg)
    text_coordinate = ((w - t_w) / 2, 10)
    draw.text(text_coordinate, text, (0, 0, 0), font=font)

    f_size = (w, h + t_h)
    f = Image.new('RGB', f_size, color='white')
    f.paste(im, (0, 0))
    f.paste(bg, (0, (h - t_h)))
    # 这里可以保存你的表情包生成,可以采取时间来命名生成文件,或者事先定义生成的图片。
    # 引入时间区分文件名
    # x = time.localtime(time.time())
    # y = time.strftime('%Y%m%d%H%M%S', x)
    # img_path = f'{os.getcwd()}/src/plugins/make_express/database/image_express/{keys}{y}.jpg'  
    out_path = f'/home/xiaochen/database/image_express/output.jpg'
    f.save(str(out_path))

2、图片模板生成

from PIL import Image,ImageDraw,ImageFont

# 图片生成
if __name__ == '__main__':
    im = Image.open("F:/image/xiongmaoA.jpg")  #340*252
    w, h = im.size
    print(w,h)
    jgz = Image.open("F:/image/xiongmaoA1.jpg")  #135*130
    a, b = jgz.size
    print(a,b)
    #z表示左右像素,w-a表示从左到右的位置,0表示顶格位置
    x = a+10
    y = b+10
    z = x+a
    g= y+b
    z=w-a
    r=h-b
    #(0,0,a,b)
    im1=im.paste(jgz,(z,0))
    im.show()
    im.save("F:/image/aoqi1.jpg")

3、nonebot2代码

expression = on_command('生成表情')


@expression.handle()
async def handle_first_receive(bot: Bot, event: Event, state: T_State):
    args = str(event.get_message()).strip()
    if args:
        state["expression"] = args


@expression.got("expression", prompt="生成表情包类型及语句(例如:奥奇1/给我爬)?")
async def handle_expression(bot: Bot, event: Event, state: T_State):
    msg = state["expression"]
    s = str.split(msg, "/")
    if str(len(s)) != "2":
        await expression.finish("输入格式有误,若要生成表情请参照格式Ov<")
    else:
        if int(len(s[1])) >= 13:
            await expression.finish("输入字数过多,效果不佳,建议重试Ov<")
        else:
            if str(s[0]) in list:
                get_express_img(str(s[0]), str(s[1]))
                # 图片路径请自行定义,win系统将下面file://{img_path}改为file:///{img_path}
                img_path = f'/home/xiaochen/src/plugins/make_express/database/image_express/output.jpg'
                img = MessageSegment.image(f'file://{img_path}')
                await expression.send(img)
            else:
                await expression.finish("生成表情范围有限Ov<")

总结

需要事先建立文件夹,传入你要生成的表情包模板。没有想要的表情包模板可以通过代码2进行自定义拼接。在定义完表情包生成函数后,只需要按照机器人格式进行图片发送即可。插件下载https://github.com/PnengChen/nonebot2

如果你热爱nonebot2机器人,可加群:970353786,非诚勿扰。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迟步彩云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值