最新版的python写春联,支持行书隶书楷书,不再有缺失汉字(代码片段)

天元浪子 天元浪子     2022-12-05     749

关键词:

1. 前言

两年前的今天,我写过一篇名为《用Python写春联:抒写最真诚的祝福和最美好的祈愿》的文章,吸引了很多书法爱好者的关注。该文用的是田英章老师的楷书,我在网上总共找到了1600个汉字,因此,春联用字被限制在这1600个汉字的小字库中。

近日,随着春节临近,这篇旧文又再次被网友们翻出,每日浏览量超过5000人次。由于字库过小,连很多常用字都没有收入,很多朋友留言,要求扩容字库以及支持其他字体。我个人精力有限,同时受知识产权保护的限制,不可能制作完整的毛笔字库。那么,能否借用现有的矢量字库,满足朋友们的要求呢?

经过一番尝试,发现操作系统自带的某些矢量字库,是可以作为毛笔字库使用的。以下是简单的演示代码,仅供学习编程技术之用,绝无侵犯字体权利人之权力的故意,特此声明。

2. 选择矢量字库

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

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

还是以“龙凤呈祥”这个图案为例吧。如果换用其他的图案,请确保图案是.png格式(背景透明),且是方形的。同字体文件一样,我们需要将这个背景图案的全路径文件名替换到代码中的BG_FILE常量即可。

4. 完整代码

全部代码总共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')

5. 样例


代码写春联js+html版本与python版本

一、春联一1.前言需要代码文末公众号找我回复【春联】即可获取效果展示3.代码展示index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>css3春联切换</title><linkrel 查看详情

新年快到了,如何运用python实现春联

这篇博文可能写晚了,现在已经是初五了,哈哈!小编也是最近才想到的,看到老爸去年二十九(或者三十)在写春联,当时觉得他写的好慢啊!(不过让我来写,肯定不行!),于是萌生了用小编所学知识实现春联,只不过家里面... 查看详情

新年快到了,如何运用python实现春联

这篇博文可能写晚了,现在已经是初五了,哈哈!小编也是最近才想到的,看到老爸去年二十九(或者三十)在写春联,当时觉得他写的好慢啊!(不过让我来写,肯定不行!),于是萌生了用小编所学知识实现春联,只不过家里面... 查看详情

新年快到了,如何运用python实现春联

这篇博文可能写晚了,现在已经是初五了,哈哈!小编也是最近才想到的,看到老爸去年二十九(或者三十)在写春联,当时觉得他写的好慢啊!(不过让我来写,肯定不行!),于是萌生了用小编所学知识实现春联,只不过家里面... 查看详情

用python写春联,我还是第一次见(代码片段)

...教大家如何用代码生成上面那样的对联了!一、安装Python环境1.在百度输入Pyth官网,回车。搜索结果中第一条就是官网的网址www.python.org。2. 查看详情

ai写春联背后的“小心思”和“大道理”

毫无疑问,“智能春联”是这个春节里AI圈最大的主角。只需要输入一个词,智能春联系统就能作出一副喜庆吉利的春联,将高科技的人工智能与流传千年的春联有趣的结合在一起。由百度首次推出的智能春联系统,既应景又容... 查看详情

海龟库画春联怎么画

Python就好比编程界的瑞士军刀,开箱即用、无所不能。这得益于Python简洁易用的语法,以及丰富的第三方库,你想在电脑上做什么,总能找到事半功倍的第三方库。比如,在这新春佳节之际,用Python来写个春联能做到吗?用Python... 查看详情

刚柔相济端庄大方——张銅彦行楷书摭谈

...央数字电视书画频道特聘教授。能写多种书体,尤擅隶书、行楷、和魏碑。当今书坛,行草书似乎有一统天下之势,书者众多 查看详情

在外打工好久不回老家,用python为家里贴上新年春联

...春联;旧年辞别迎新岁,时序车轮总向前。”所以今天用Python写一副春联&福字送给大家,本文我们主要用到的Python库为 tkinter,库下面一起来看一下具体代吗吧。目录唠叨神话初始化制作上联 查看详情

编码问题

...======做个简单的比喻,unicode相当于中文,UTF-8,UTF-16等相当于行书,楷书,草书等各种书写方式.讲到细节, 查看详情

新版的nuget包packagelicense这样写(代码片段)

...以指定一个PackageLicenseUrl来指定这个包的license,现在不再支持了,现在有两种方式可以指定,一种是LicenseExpression一种是LicenseFile。LicenseExpression示例:<ProjectSdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandar... 查看详情

不再写pythonfor循环(代码片段)

...去学习使用比较高级、比较地道的语法或library。文中以python为例子,讲了不少大家其实在别人的代码里都见过、但自己很少用的语法。自从我开始探索Python中惊人的语言功能已经有一段时间了。一开始,我给自己一个挑... 查看详情

从此不再担心键盘遮住输入框oc(

从此不再担心键盘遮住输入框OC(二)字数544 阅读1492 评论15 喜欢25在我发布这篇文章没多久之前,我发布了一篇叫 从此不再担心键盘遮住输入框OC(一)的文章。我在那篇文章中介绍了我的键盘组件KeyboardToolBar。新版... 查看详情

贴春联的讲究与禁忌

...年三十想必大家必不可少的一件要做那就是在自家门口贴春联,期待新的一年能好运连连,之前一直没有详细了解过其中的规矩,今日特意了解一番,让那些小白们也可以了解一下(花两分钟了解一下,你不亏),当然各地风俗... 查看详情

django与mysql数据库版本兼容问题(代码片段)

第一个Python与Django的兼容关系1、python2.7支持到2020年2、Django2.0后均不再支持python23、Django2.0是最后一个支持Python3.4的版本4.目前为止开发学习最好用Django2.1第二个Django与MySQL的兼容关系1、Django1无所谓2、Django2.1不再支持MySQL5.5,必... 查看详情

edge浏览器不再支持showmodaldialog?有何替代方案

参考技术A建议安装最新的360安全浏览器,用360安全浏览器就可以正常。本回答被提问者采纳 查看详情

运行openmp需要安装啥软件?

RT谢谢不需要什么额外的软件!现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持。比如gcc、g++、gfortran(GCC套件4.2版之后开始支持)IntelC++compiler、IntelFortrancompilerMicrosoftvisualC++(版本8.0或者叫2005之后开始支持)由支持OpenM... 查看详情

django2.0新特性(代码片段)

...对广大Django使用者有哪些变化和需要注意的地方呢?一、Python兼容性Django2.0支持Python3.4、3.5和3.6。Django官方强烈推荐每个系列的最新版本。最重要的是Django2.0不再支持Python2!Django1.11.x是支持Python2.7的最后版本。二、2.0新特 查看详情