快过年了,教大家用python来写春联,支持行书隶书楷书
仅供学习编程技术之用,绝无侵犯字体权利人之权力的故意,特此声明。
选择矢量字库
虽然有很多方法可以帮你呈现出系统支持的所有字体文件,我建议最直接的方式是去查看操作系统的字体目录。以Windows为例,我直接在C:\Windows\Fonts这个路径下找到了“华文隶书”这个字库文件,查看属性可知,该文件名为STLITI.TTF。找到了喜欢的字库文件,只需要将其全路径文件名替换到代码中的FONT_FILE常量即可,不需要做其他操作。
选择一款喜欢的春联背景图案
还是以“龙凤呈祥”这个图案为例吧。如果换用其他的图案,请确保图案是.png格式(背景透明),且是方形的。同字体文件一样,我们需要将这个背景图案的全路径文件名替换到代码中的BG_FILE常量即可。
完整代码
全部代码总共70余行,使用方法请看注释。
# -*- coding: utf-8 -*- import os import freetype import numpy as np from PIL import Image FONT_FILE = r'C:\Windows\Fonts\STLITI.TTF' BG_FILE = r'D:\temp\bg.png' def text2image(word, font_file, size=128, color=(0,0,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] * 255 g = np.ones(pixels.shape) * color[1] * 255 b = np.ones(pixels.shape) * color[2] * 255 im = np.dstack((r, g, b, pixels)).astype(np.uint8) return Image.fromarray(im) def write_couplets(text, horv='V', quality='L', out_file=None, bg=BG_FILE): """写春联 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_FILE) if size < 640: im_bg = im_bg.resize((size, size)) for i, w in enumerate(text): im_w = text2image(w, FONT_FILE, size=tsize, color=(0,0,0)) 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) im_out.save('%s.png'%text) os.startfile('%s.png'%text) if __name__ == '__main__': write_couplets('普天同庆', horv='V', quality='H') write_couplets('欢度春节', horv='V', quality='H') write_couplets('国泰民安', horv='H', quality='H')
# 兄弟们学习python,有时候不知道怎么学,从哪里开始学。掌握了基本的一些语法或者做了两个案例后,不知道下一步怎么走,不知道如何去学习更加高深的知识。 # 那么对于这些大兄弟们,我准备了大量的免费视频教程,PDF电子书籍,以及视频源的源代码! # 还会有大佬解答! # 都在这个群里了 924040232 # 欢迎加入,一起讨论 一起学习!
效果展示
文章转自天元浪子
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」