Python編寫春聯(lián)的示例代碼(支持行書隸書楷書)
僅供學(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 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)):
"""使用指定字庫將單個漢字轉(zhuǎn)為圖像
word - 單個漢字字符串
font_file - 矢量字庫文件名
size - 字號,默認(rèn)128
color - 顏色,默認(rèn)黑色
"""
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):
"""寫春聯(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.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('歡度春節(jié)', horv='V', quality='H')
write_couplets('國泰民安', horv='H', quality='H')效果展示


到此這篇關(guān)于Python編寫春聯(lián)的示例代碼(支持行書隸書楷書)的文章就介紹到這了,更多相關(guān)Python春聯(lián)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python的Asyncore異步Socket模塊及實現(xiàn)端口轉(zhuǎn)發(fā)的例子
asyncore模塊是封裝過的處理socket事件的模塊,采用異步的處理方式,這里我們講來講解Python的Asyncore異步Socket模塊及實現(xiàn)端口轉(zhuǎn)發(fā)的例子,需要的朋友可以參考下2016-06-06
Python 數(shù)據(jù)處理庫 pandas 入門教程基本操作
pandas是一個Python語言的軟件包,在我們使用Python語言進行機器學(xué)習(xí)編程的時候,這是一個非常常用的基礎(chǔ)編程庫。本文是對Python 數(shù)據(jù)處理庫 pandas 入門教程,非常不錯,感興趣的朋友一起看看吧2018-04-04

