最新版的Python写春联,支持行书隶书楷书,不再有缺失汉字
1. 前言
兩年前的今天,我寫(xiě)過(guò)一篇名為《用Python寫(xiě)春聯(lián):抒寫(xiě)最真誠(chéng)的祝福和最美好的祈愿》的文章,吸引了很多書(shū)法愛(ài)好者的關(guān)注。該文用的是田英章老師的楷書(shū),我在網(wǎng)上總共找到了1600個(gè)漢字,因此,春聯(lián)用字被限制在這1600個(gè)漢字的小字庫(kù)中。
近日,隨著春節(jié)臨近,這篇舊文又再次被網(wǎng)友們翻出,每日瀏覽量超過(guò)5000人次。由于字庫(kù)過(guò)小,連很多常用字都沒(méi)有收入,很多朋友留言,要求擴(kuò)容字庫(kù)以及支持其他字體。我個(gè)人精力有限,同時(shí)受知識(shí)產(chǎn)權(quán)保護(hù)的限制,不可能制作完整的毛筆字庫(kù)。那么,能否借用現(xiàn)有的矢量字庫(kù),滿(mǎn)足朋友們的要求呢?
經(jīng)過(guò)一番嘗試,發(fā)現(xiàn)操作系統(tǒng)自帶的某些矢量字庫(kù),是可以作為毛筆字庫(kù)使用的。以下是簡(jiǎn)單的演示代碼,僅供學(xué)習(xí)編程技術(shù)之用,絕無(wú)侵犯字體權(quán)利人之權(quán)力的故意,特此聲明。
2. 選擇矢量字庫(kù)
雖然有很多方法可以幫你呈現(xiàn)出系統(tǒng)支持的所有字體文件,我建議最直接的方式是去查看操作系統(tǒng)的字體目錄。以Windows為例,我直接在C:\Windows\Fonts這個(gè)路徑下找到了“華文隸書(shū)”這個(gè)字庫(kù)文件,查看屬性可知,該文件名為STLITI.TTF。找到了喜歡的字庫(kù)文件,只需要將其全路徑文件名替換到代碼中的FONT_FILE常量即可,不需要做其他操作。
3. 選擇一款喜歡的春聯(lián)背景圖案
還是以“龍鳳呈祥”這個(gè)圖案為例吧。如果換用其他的圖案,請(qǐng)確保圖案是.png格式(背景透明),且是方形的。同字體文件一樣,我們需要將這個(gè)背景圖案的全路徑文件名替換到代碼中的BG_FILE常量即可。
4. 完整代碼
全部代碼總共70余行,使用方法請(qǐng)看注釋。
# -*- coding: utf-8 -*-import os import freetype import numpy as np from PIL import ImageFONT_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)):"""使用指定字庫(kù)將單個(gè)漢字轉(zhuǎn)為圖像word - 單個(gè)漢字字符串font_file - 矢量字庫(kù)文件名size - 字號(hào),默認(rèn)128color - 顏色,默認(rèn)黑色"""face = freetype.Face(font_file)face.set_char_size(size*size)face.load_char(word)btm_obj = face.glyph.bitmapw, h = btm_obj.width, btm_obj.rowspixels = 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] * 255g = np.ones(pixels.shape) * color[1] * 255b = np.ones(pixels.shape) * color[2] * 255im = 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):"""寫(xiě)春聯(lián)text - 春聯(lián)字符串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.sizedw, dh = (size - w)//2, (size - h)//2if 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('歡度春節(jié)', horv='V', quality='H')write_couplets('國(guó)泰民安', horv='H', quality='H')5. 樣例
總結(jié)
以上是生活随笔為你收集整理的最新版的Python写春联,支持行书隶书楷书,不再有缺失汉字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTTP缓存的深入介绍:Cache-Co
- 下一篇: 面向全球用户的Teams app之夏令时