1 效果
2 說明
=====
https://blog.csdn.net/xufive/article/details/104059396
2.2 修改:對原始碼的垂直對聯V進行適當修改,用matplotlib展示圖片。
3 程式碼
=====
3.1 第1步:匯入模組
import ioimport requestsfrom PIL import Imageimport matplotlib.pyplot as plt #用來展示圖片
3.2 第2步:定義函式,獲取線上漢字樣式
def get_word(ch, quality): """獲取單個漢字(字元)的圖片 ch - 單個漢字或英文字母(僅支援大寫) quality - 單字解析度,H-640畫素,M-480畫素,L-320畫素 """ # 把請求到的資料轉換為Bytes位元組流 fp = io.BytesIO(requests.post(url='http://xufive.sdysit.com/tk', data={'ch':ch}).content) im = Image.open(fp) w, h = im.size if quality == 'M': w, h = int(w*0.75), int(0.75*h) elif quality == 'L': w, h = int(w*0.5), int(0.5*h) return im.resize((w,h))
3.3 第3步:獲取對聯背景圖
def get_bg(quality): """獲取春聯背景的圖片""" return get_word('bg', quality)
3.4 第4步:寫春聯
def write_couplets(text, HorV='V', quality='L', out_file=None): """生成春聯 text - 春聯內容,以空格斷行 HorV - H-橫排,V-豎排 quality - 單字解析度,H-640畫素,M-480畫素,L-320畫素 out_file - 輸出檔名 """ usize = {'H':(640,23), 'M':(480,18), 'L':(320,12)} bg_im = get_bg(quality) text_list = [list(item) for item in text.split()] #行 rows = len(text_list) #列,一般是2 cols = max([len(item) for item in text_list]) if HorV == 'V': #40+cols是與下邊的距離,40+rows是與左邊的距離 ow, oh = 40+rows*usize[quality][0]+(rows-1)*10, 40+cols*usize[quality][0] else: ow, oh = 40+cols*usize[quality][0], 40+rows*usize[quality][0]+(rows-1)*10 #out_im = Image.new('RGBA', (ow, oh), '#f0f0f0') #春聯的畫布的底色是黃色,大小 out_im = Image.new('RGBA', (ow+2000, oh), 'yellow') for row in range(rows): if HorV == 'V': #row_im = Image.new('RGBA', (usize[quality][0], cols*usize[quality][0]), 'white') row_im = Image.new('RGBA', (usize[quality][0], cols*usize[quality][0]), 'yellow') #20是與上面的距離 #offset = (ow-(usize[quality][0]+10)*(row+1)-10, 20) #+4000是與左邊的距離,左邊對聯 #+2000是與左邊距離,右邊對聯 offset = (ow-(usize[quality][0]+2000)*(row+1)+4000, 20) else: row_im = Image.new('RGBA', (cols*usize[quality][0], usize[quality][0]), 'white') offset = (20, 20+(usize[quality][0]+10)*row) for col, ch in enumerate(text_list[row]): if HorV == 'V': pos = (0, col*usize[quality][0]) else: pos = (col*usize[quality][0],0) ch_im = get_word(ch, quality) row_im.paste(bg_im, pos) row_im.paste(ch_im, (pos[0]+usize[quality][1], pos[1]+usize[quality][1]), mask=ch_im) out_im.paste(row_im, offset) if out_file: out_im.convert('RGB').save(out_file) #改進一下,用matplotlib顯示圖片 imgxx = plt.imread(out_file) plt.imshow(imgxx) plt.axis('off') plt.show() #用image顯示 #out_im.show()
3.5 第5步:改成終端輸入對聯文字
text=input('請輸入對聯:')#text = '普天同慶 歡度春節'#儲存和顯示圖片write_couplets(text, HorV='V', quality='M', out_file='chunlian.jpg')'''例如:注意上聯和下聯之間有一個空格爆竹聲聲辭舊歲 和風送暖迎新春'''
4 簡潔完整的程式碼:
import ioimport requestsfrom PIL import Imageimport matplotlib.pyplot as plt def get_word(ch, quality): fp = io.BytesIO(requests.post(url='http://xufive.sdysit.com/tk', data={'ch':ch}).content) im = Image.open(fp) w, h = im.size if quality == 'M': w, h = int(w*0.75), int(0.75*h) elif quality == 'L': w, h = int(w*0.5), int(0.5*h) return im.resize((w,h))def get_bg(quality): return get_word('bg', quality)def write_couplets(text, HorV='V', quality='L', out_file=None): usize = {'H':(640,23), 'M':(480,18), 'L':(320,12)} bg_im = get_bg(quality) text_list = [list(item) for item in text.split()] rows = len(text_list) cols = max([len(item) for item in text_list]) if HorV == 'V': ow, oh = 40+rows*usize[quality][0]+(rows-1)*10, 40+cols*usize[quality][0] else: ow, oh = 40+cols*usize[quality][0], 40+rows*usize[quality][0]+(rows-1)*10 out_im = Image.new('RGBA', (ow+2000, oh), 'yellow') for row in range(rows): if HorV == 'V': row_im = Image.new('RGBA', (usize[quality][0], cols*usize[quality][0]), 'yellow') offset = (ow-(usize[quality][0]+2000)*(row+1)+4000, 20) else: row_im = Image.new('RGBA', (cols*usize[quality][0], usize[quality][0]), 'white') offset = (20, 20+(usize[quality][0]+10)*row) for col, ch in enumerate(text_list[row]): if HorV == 'V': pos = (0, col*usize[quality][0]) else: pos = (col*usize[quality][0],0) ch_im = get_word(ch, quality) row_im.paste(bg_im, pos) row_im.paste(ch_im, (pos[0]+usize[quality][1], pos[1]+usize[quality][1]), mask=ch_im) out_im.paste(row_im, offset) if out_file: out_im.convert('RGB').save(out_file) imgxx = plt.imread(out_file) plt.imshow(imgxx) plt.axis('off') plt.show()text=input('請輸入對聯:')write_couplets(text, HorV='V', quality='M', out_file='chunlian.jpg')
來寫春聯
最新評論