1

用Python写春联,我还是第一次见

 2 years ago
source link: https://blog.csdn.net/qq_39400113/article/details/122566775
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

春节,即中国农历新年,俗称新春、新岁、岁旦等,口头上又称过年、过大年。春节历史悠久,由上古时代岁首祈岁祭祀演变而来。在春节期间,全国各地均有举行各种庆贺新春活动,这些活动以除旧布新、驱邪攘灾、拜神祭祖、纳福祈年为主要内容,形式丰富多彩,凝聚着中华传统文化精华。

每逢春节,无论城市还是农村,家家户户都要挑漂亮的红春联贴于门上,辞旧迎新,增加喜庆的节日气氛。春联的另一来源是春贴,古人在立春日多贴“宜春”二字,后渐渐发展为春联,表达了中国劳动人民一种辟邪除灾、迎祥纳福的美好愿望。 世界纪录协会收录的世界最早的春联是“三阳始布;四序初开”,这副春联记载在莫高窟藏经洞出土的敦煌遗书上,撰联人为唐人刘丘子,作于开元十一年723年。

三阳始布 四序初开

程序员借助于代码,同样可以写出漂亮的春联,这里我向大家送上我最真诚的祝福和最美好的祈愿。

接下来就教大家如何用代码生成上面那样的对联了!

一、安装Python环境

1.在百度输入Pyth官网,回车。搜索结果中第一条就是官网的网址www.python.org

format,png#pic_center

2.这是一个英文的网站,如果你用的是谷歌浏览器,可以使用自带的谷歌将网站翻译成中文的。这样看起来就非常的方便。在网页的上方有一排菜单栏,点击“DownLoads”,在下拉列表中点击第三个菜单“Windows

format,png#pic_center

3.在这里下载python安装包。要根据你电脑的位数下载对应的安装包。现在绝大多数人的电脑都是64位的。这里我们选择Windows x86-64 executable installer,双击下载得到的python-3.8.1-amd64.exe,就可以正式开始安装 Python 了。

format,png#pic_center

下载后傻瓜式安装即可!

4.安装完成以后,进入桌面同时按下win+右键,会看到在此处打开Powershell窗口(S)在窗口中输入python.exe命令(注意字母.是实心的),如果出现Python的版本信息,并看到命令提示符>>>,就说明安装成功了,如下图所示。

format,png#pic_center

format,png#pic_center

二、安装相应的库

按下键盘的WIN+R键导出命令窗口,依次出入下面三条命令进行安装即可。

pip install Pillow
pip install numpy
pip install requests

三、编写代码

这里的代码借鉴的网上的,如有侵权,我停止服务并删除!

1.导入以下模块

import io
from PIL import Image
import numpy as np
import requests

2.下载字模

def get_word(ch, quality):
    """获取单个汉字(字符)的图片
    ch          - 单个汉字或英文字母(仅支持大写)
    quality     - 单字分辨率,H-640像素,M-480像素,L-320像素
    """
    
    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.生成春联

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)
    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, oh), '#f0f0f0')
    
    for row in range(rows):
        if HorV == 'V':
            row_im = Image.new('RGBA', (usize[quality][0], cols*usize[quality][0]), 'white')
            offset = (ow-(usize[quality][0]+10)*(row+1)-10, 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)
    out_im.show()

四、完整春联

import io
from PIL import Image
import numpy as np
import requests
def get_word(ch, quality):
    """获取单个汉字(字符)的图片
    ch          - 单个汉字或英文字母(仅支持大写)
    quality     - 单字分辨率,H-640像素,M-480像素,L-320像素
    """
 
    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):
    """生成春联
    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)
    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, oh), '#f0f0f0')
 
    for row in range(rows):
        if HorV == 'V':
            row_im = Image.new('RGBA', (usize[quality][0], cols*usize[quality][0]), 'white')
            offset = (ow-(usize[quality][0]+10)*(row+1)-10, 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)
    out_im.show()
text = '牛聚成云天降玉 虎来踏露地生金'
write_couplets(text, HorV='H', quality='M', out_file='欢度春节.jpg')

等待十几秒钟,即可生成对联,对联生成得我格式的.png的形式。

牛聚成云天降玉 虎来踏露地生金

再来一个牛舞烟花报捷去 虎持金捧送春来

text1 = '虎跃龙腾生紫气 风调雨顺兆丰年'
text2 = '虎跃龙腾'
write_couplets(text1, HorV='H', quality='M', out_file='上下批.jpg')
write_couplets(text2, HorV='H', quality='M', out_file='横批.jpg')

抗击疫情,从我做起,人人有责!

横批:真情永驻


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK