作者 | 許向武? ? ? ?責(zé)編 | 張紅月
出品 | CSDN博客
兩年前的今天,我寫過一篇名為《用Python寫春聯(lián):抒寫最真誠的祝福和最美好的祈愿》(https://blog.csdn.net/xufive/article/details/104059396)的文章,吸引了很多書法愛好者的關(guān)注。該文用的是田英章老師的楷書,我在網(wǎng)上總共找到了1600個漢字,因此,春聯(lián)用字被限制在這1600個漢字的小字庫中。
當(dāng)下2022年新年的鐘聲即將敲響,過往的這篇舊文又再次被網(wǎng)友們翻出,每日瀏覽量超過5000人次。由于字庫過小,連很多常用字都沒有收入,很多朋友留言,要求擴容字庫以及支持其他字體。我個人精力有限,同時受知識產(chǎn)權(quán)保護(hù)的限制,不可能制作完整的毛筆字庫。那么,能否借用現(xiàn)有的矢量字庫,滿足朋友們的要求呢?
經(jīng)過一番嘗試,發(fā)現(xiàn)操作系統(tǒng)自帶的某些矢量字庫,是可以作為毛筆字庫使用的。以下是簡單的演示代碼,僅供學(xué)習(xí)編程技術(shù)之用,絕無侵犯字體權(quán)利人之權(quán)力的故意,特此聲明。
選擇矢量字庫
雖然有很多方法可以幫你呈現(xiàn)出系統(tǒng)支持的所有字體文件,我建議最直接的方式是去查看操作系統(tǒng)的字體目錄。以Windows為例,我直接在C:\Windows\Fonts這個路徑下找到了“華文隸書”這個字庫文件,查看屬性可知,該文件名為STLITI.TTF。找到了喜歡的字庫文件,只需要將其全路徑文件名替換到代碼中的FONT_FILE常量即可,不需要做其他操作。
選擇一款喜歡的春聯(lián)背景圖案
還是以“龍鳳呈祥”這個圖案為例。如果換用其他的圖案,請確保圖案是.png格式(背景透明),且是方形的。同字體文件一樣,我們需要將這個背景圖案的全路徑文件名替換到代碼中的BG_FILE常量即可。
完整代碼
全部代碼總共70余行,使用方法請看注釋。
# -*- 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)):"""使用指定字庫將單個漢字轉(zhuǎn)為圖像word - 單個漢字字符串font_file - 矢量字庫文件名size - 字號,默認(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):"""寫春聯(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('國泰民安',?horv='H',?quality='H')
樣例
最后,祝大家新年快樂,虎年大吉,虎虎生威,身體健康,事事順心。
原文鏈接:https://blog.csdn.net/xufive/article/details/122623982
《新程序員003》正式上市,50余位技術(shù)專家共同創(chuàng)作,云原生和數(shù)字化的開發(fā)者們的一本技術(shù)精選圖書。內(nèi)容既有發(fā)展趨勢及方法論結(jié)構(gòu),華為、阿里、字節(jié)跳動、網(wǎng)易、快手、微軟、亞馬遜、英特爾、西門子、施耐德等30多家知名公司云原生和數(shù)字化一手實戰(zhàn)經(jīng)驗!
?被罵慘的 Windows 11 還是“真香”了:下月將支持 Android 應(yīng)用,產(chǎn)品滿意度歷代最高!
?每天敲代碼不到 1 小時?這就是程序員的“真實”日常!
?cURL作者狂懟某500強公司,開源維護(hù)者是否應(yīng)當(dāng)“白打工”?
總結(jié)
以上是生活随笔為你收集整理的70 行 Python 代码写春联,支持行书隶书楷书!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。