“爆竹聲中一歲除,春風送暖入屠蘇,千門萬戶曈曈日,總把新桃換舊符,”
又到農歷新年,家家戶戶張燈結彩,掃除,貼春聯,出處洋溢著喜慶和歡樂,又是Python大顯身手的時刻,今天有請它來寫春聯,
開始之前,先做一點準備作業:
- 下載自己喜歡的字體(本文所用字體為臨時展示使用,著作權歸原作者)
- 下載自己喜歡的背景,在此我選擇的是傳統的燙金紅紙(臨時展示使用,著作權歸原作者)
- 安裝freetype和numpy等第三方庫【FreeType庫是一個開源的、高質量且可移植的字體引擎;numpy為開源的數值計算擴展,可用來存盤和處理大型矩陣】
準備就緒,接下來,就看Python的了!



完整代碼如下:
#寫春聯
import freetype
import numpy as np
from PIL import Image
font = r'...' #所需Truetype字體,請自行補齊存放檔案路徑
BG = r'...' #所需背景圖片,最好640*640像素,請自行補齊存放檔案路徑
def text2image(word, font, size, color)):
'''
將字庫相應漢字轉換為影像(默認size=128,color=(0,0,0))
'''
face = freetype.Face(font)
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, quality):
'''
text - 春聯字串
horv - H-橫排,V-豎排
quality - 單字解析度,H-640像素,L-320像素
'''
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)
if size < 640:
im_bg = im_bg.resize((size, size))
for i, w in enumerate(text):
im_w = text2image(w, font, 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) #輸出png圖片,默認位置為我的檔案
left = '一帆風順年年好'
right = '萬事如意步步高'
central = '虎年大吉'
if __name__ == '__main__':
write_couplets(left, horv='V', quality='H')
write_couplets(right, horv='V', quality='H')
write_couplets(central, horv='H', quality='H')
代碼部分借鑒大神天元浪子,在此頂禮膜拜!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423206.html
標籤:AI
下一篇:pandas獲取dataframe中索引值最小值所在的資料行(get dataframe row of min index value)
