程序员的端午节 python 代码写端午对联:时逢端午思屈子 每见龙舟想汨罗

这篇博客展示了如何使用Python3.6和PIL库来生成端午节对联。通过调用特定API获取汉字图片,结合背景图片,程序能够自动生成横排或竖排的对联,并可调整分辨率。示例代码创建了对联时逢端午思屈子,每见龙舟想汨罗,并保存为我的对联.jpg。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序员的端午节 python 代码写端午对联:时逢端午思屈子,每见龙舟想汨罗。

首先是 环境 :

使用  python3.6  pycharm 

需要的包:

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

字体获取 

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()

全部的代码 可以直接运行 :

# -*- coding: utf-8 -*-

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


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()


if __name__ == "__main__":
    text = str("时逢端午思屈子") + ' ' + str("每见龙舟想汨罗")
    print(text)
    write_couplets(text, HorV='V', quality='M', out_file='我的对联.jpg')

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜辣uu

谢谢关注再接再厉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值