文章目錄
- 前言
- 一、匯入
- 二、效果
- 三、代碼
- 總結
前言
基于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_city(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,非誠勿擾,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296694.html
標籤:其他
