★★★ 本文源自AI Studio社区精品项目,【点击此处】查看更多精品内容 >>>
【新春特辑】基于文心大模型的新年春联生成器
一、技术路线
- 首先,使用文心大模型的对联功能,通过上联生成下联;
- 其次,使用图片处理方式,将生成的对联与背景合并在一起;
- 最后,生成可打印的对联图片文件,预览效果如下所示:
二、代码实现
!pip install freetype-py
!pip install wenxin-api
import wenxin_api # 可以通过"pip install wenxin-api"命令安装
from wenxin_api.tasks.couplet import Couplet
wenxin_api.ak = ""
wenxin_api.sk = ""
input_dict = {
"text": "上联:金虎辞旧岁\n下联:",
"seq_len": 32,
"topp": 0.8,
"penalty_score": 1.15,
"min_dec_len": 1,
"is_unidirectional": 0,
"task_prompt": "couplet"
}
rst_text = Couplet.create(**input_dict)
print(rst_text)
import os
import freetype
import numpy as np
from PIL import Image
FONT_FILE = 'SIMYOU.TTF'
BG_FILE = 'bg.jpg'
def text2image(word, font_file, size=128, color=(218, 179, 0)):
"""使用指定字库将单个汉字转为图像
word - 单个汉字字符串
font_file - 矢量字库文件名
size - 字号,默认128
color - 颜色,默认黑色
"""
face = freetype.Face(font_file)
face.set_char_size(size * size)
face.load_char(word)
btm_obj = face.glyph.bitmap
w, h = btm_obj.width, btm_obj.rows
pixels = np.array(btm_obj.buffer, dtype=np.uint8).reshape(h, w)
dx = int(face.glyph.metrics.horiBearingX / 64)
if dx > 0:
patch = np.zeros((pixels.shape[0], dx), dtype=np.uint8)
pixels = np.hstack((patch, pixels))
r = np.ones(pixels.shape) * color[0]
g = np.ones(pixels.shape) * color[1]
b = np.ones(pixels.shape) * color[2]
im = np.dstack((r, g, b, pixels)).astype(np.uint8)
return Image.fromarray(im)
# img = text2image('国', font_file=FONT_FILE, size=128, color=(218, 179, 0))
def write_couplets(text, horv='V', quality='L', color =(0,0,0) ,out_file=None):
"""写春联
text - 春联字符串
bg - 背景图片路径
horv - H-横排,V-竖排
quality - 单字分辨率,H-640像素,L-320像素
out_file - 输出文件名
"""
size, tsize = (320, 128) if quality == 'L' else (640, 180)
ow, oh = (size, size * len(text)) if horv == 'V' else (size * len(text), size)
im_out = Image.new('RGBA', (ow, oh), '#f0f0f0')
im_bg = Image.open('bg.jpg')
print()
font_file = 'SIMYOU.TTF'
# 生成图片
for i, w in enumerate(text):
im_w = text2image(w, font_file, size=tsize, color=color)
w, h = im_w.size
dw, dh = (size - w) // 2, (size - h) // 2
if horv == 'V':
im_out.paste(im_bg, (0, i * size))
im_out.paste(im_w, (dw, i * size + dh), mask=im_w)
else:
im_out.paste(im_bg, (i * size, 0))
im_out.paste(im_w, (i * size + dw, dh), mask=im_w)
return im_out
shanglian = "金虎辞旧岁"
xialian = rst_text['result']
hengpi = '辞旧迎新'
shanglian_img = write_couplets(shanglian, horv='V', quality='L', color =(0,0,0) ,out_file=None)
shanglian_img.save('shanglian.png')
xialian_img = write_couplets(xialian, horv='V', quality='L', color =(0,0,0) ,out_file=None)
xialian_img.save('xialian.png')
hengpi_img = write_couplets(hengpi, horv='H', quality='L', color =(0,0,0) ,out_file=None)
hengpi_img.save('hengpi.png')
三、结果展示
总结
本次项目主要使用了一些基础的图像处理方法。首先,将汉字的字符串转换为图片,其次将汉字图片贴在我们的背景图上,通过垂直拼接与水平拼接分别生成对联与横批。最后,祝大家新春快乐。