Python編寫春聯(lián)的示例代碼(支持行書隸書楷書)
僅供學(xué)習(xí)編程技術(shù)之用,絕無(wú)侵犯字體權(quán)利人之權(quán)力的故意,特此聲明。
選擇矢量字庫(kù)
雖然有很多方法可以幫你呈現(xiàn)出系統(tǒng)支持的所有字體文件,我建議最直接的方式是去查看操作系統(tǒng)的字體目錄。以Windows為例,我直接在C:\Windows\Fonts這個(gè)路徑下找到了“華文隸書”這個(gè)字庫(kù)文件,查看屬性可知,該文件名為STLITI.TTF。找到了喜歡的字庫(kù)文件,只需要將其全路徑文件名替換到代碼中的FONT_FILE常量即可,不需要做其他操作
選擇一款喜歡的春聯(lián)背景圖案
還是以“龍鳳呈祥”這個(gè)圖案為例吧。如果換用其他的圖案,請(qǐng)確保圖案是.png格式(背景透明),且是方形的。同字體文件一樣,我們需要將這個(gè)背景圖案的全路徑文件名替換到代碼中的BG_FILE常量即可。
完整代碼
全部代碼總共70余行,使用方法請(qǐng)看注釋。
# -*- 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)): """使用指定字庫(kù)將單個(gè)漢字轉(zhuǎn)為圖像 word - 單個(gè)漢字字符串 font_file - 矢量字庫(kù)文件名 size - 字號(hào),默認(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('國(guó)泰民安', horv='H', quality='H')
效果展示
到此這篇關(guān)于Python編寫春聯(lián)的示例代碼(支持行書隸書楷書)的文章就介紹到這了,更多相關(guān)Python春聯(lián)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas刪除某行或某列數(shù)據(jù)的實(shí)現(xiàn)示例
本文主要介紹了pandas刪除某行或某列數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08opencv python如何實(shí)現(xiàn)圖像二值化
這篇文章主要介紹了opencv python如何實(shí)現(xiàn)圖像二值化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02tkinter如何實(shí)現(xiàn)打開(kāi)文件對(duì)話框并獲取文件絕對(duì)路徑
這篇文章主要介紹了tkinter實(shí)現(xiàn)打開(kāi)文件對(duì)話框并獲取文件絕對(duì)路徑問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01關(guān)于Java中RabbitMQ的高級(jí)特性
這篇文章主要介紹了關(guān)于Java中RabbitMQ的高級(jí)特性,MQ全稱為Message Queue,即消息隊(duì)列,"消息隊(duì)列"是在消息的傳輸過(guò)程中保存消息的容器,它是典型的:生產(chǎn)者、消費(fèi)者模型,生產(chǎn)者不斷向消息隊(duì)列中生產(chǎn)消息,消費(fèi)者不斷的從隊(duì)列中獲取消息,需要的朋友可以參考下2023-07-07python備份文件以及mysql數(shù)據(jù)庫(kù)的腳本代碼
最近正在學(xué)習(xí)python,看了幾天了,,所以寫個(gè)小腳本練習(xí)練習(xí),沒(méi)什么含金量,只當(dāng)練手2013-06-06Python之a(chǎn)scii轉(zhuǎn)中文的實(shí)現(xiàn)
這篇文章主要介紹了Python之a(chǎn)scii轉(zhuǎn)中文的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05