ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

70 行 Python 代码写春联,行书隶书楷书随你选

2022-06-16 15:04:22  阅读:191  来源: 互联网

标签:bg Python im 70 np 春联 out pixels size


前言

相信现在有很多小伙伴都不会写毛笔字了,今天想用python来写一幅春联,不知道有没有人喜欢。该文用的是田英章老师的楷

书,我在网上总共找到了1600个汉字,因此,春联用字被限制在这1600个汉字的小字库中。我个人精力有限,同时受知识产权保

护的限制,不可能制作完整的毛笔字库。那么,能否借用现有的矢量字库,满足朋友们的要求呢?经过一番尝试,发现操作系统

自带的某些矢量字库,是可以作为毛笔字库使用的。以下是简单的演示代码,仅供学习编程技术之用,绝无侵犯字体权利人之权

力的故意,特此声明。

选择矢量字库

虽然有很多方法可以帮你呈现出系统支持的所有字体文件,我建议最直接的方式是去查看操作系统的字体目录。以Windows为例,我直接在C:\Windows\Fonts这个路径下找到了“华文隶书”这个字库文件,查看属性可知,该文件名为STLITI.TTF。找到了喜欢的字库文件,只需要将其全路径文件名替换到代码中的FONT_FILE常量即可,不需要做其他操作。

在这里插入图片描述

选择一款喜欢的春联背景图案

还是以“龙凤呈祥”这个图案为例。如果换用其他的图案,请确保图案是.png格式(背景透明),且是方形的。同字体文件一样,我

们需要将这个背景图案的全路径文件名替换到代码中的BG_FILE常量即可。

在这里插入图片描述

完整代码

全部代码总共70余行,使用方法请看注释。

python学习交流Q群:906715085####
# -*- 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')

 

样例

在这里插入图片描述

最后,祝大家虎年大吉,虎虎生威,身体健康,事事顺心。

标签:bg,Python,im,70,np,春联,out,pixels,size
来源: https://www.cnblogs.com/1234567FENG/p/16381788.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有