前言

相信现在有很多小伙伴都不会写毛笔字了,今天想用python来写一幅春联,不知道有没有人喜欢。该文用的是田英章老师的楷

书,我在网上总共找到了1600个汉字,因此,春联用字被限制在这1600个汉字的小字库中。我个人精力有限,同时受知识产权保

护的限制,不可能制作完整的毛笔字库。那么,能否借用现有的矢量字库,满足朋友们的要求呢?经过一番尝试,发现操作系统

自带的某些矢量字库,是可以作为毛笔字库使用的。以下是简单的演示代码,仅供学习编程技术之用,绝无侵犯字体权利人之权

力的故意,特此声明。

选择矢量字库

虽然有很多方法可以帮你呈现出系统支持的所有字体文件,我建议最直接的方式是去查看操作系统的字体目录。以Windows为例,我直接在C:\Windows\Fonts这个路径下找到了“华文隶书”这个字库文件,查看属性可知,该文件名为STLITI.TTF。找到了喜欢的字库文件,只需要将其全路径文件名替换到代码中的FONT_FILE常量即可,不需要做其他操作。

选择一款喜欢的春联背景图案

还是以“龙凤呈祥”这个图案为例。如果换用其他的图案,请确保图案是.png格式(背景透明),且是方形的。同字体文件一样,我

们需要将这个背景图案的全路径文件名替换到代码中的BG_FILE常量即可。

完整代码

全部代码总共70余行,使用方法请看注释。

python学习交流Q群:906715085####
# -*- coding: utf-8 -*-
import os
import freetype
import numpy as np
from PIL import ImageFONT_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)):
"""使用指定字库将单个汉字转为图像
word        - 单个汉字字符串
font_file   - 矢量字库文件名
size        - 字号,默认128
color       - 颜色,默认黑色
"""
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):
"""写春联
text
- 春联字符串    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('欢度春节', horv='V', quality='H')
write_couplets('国泰民安', horv='H', quality='H')

样例

最后,祝大家虎年大吉,虎虎生威,身体健康,事事顺心。

70 行 Python 代码写春联,行书隶书楷书随你选相关推荐

  1. python text insert()背景色_50行python代码写个计算器教程

    案例展示 计算器.gif 你能学到 input 用户输入 print输出 tkinter图形界面 python运算符号 基础知识准备 运算符号 数字运算,求和我们使用了加号 (+)运算符,除此外,还有 ...

  2. python中tk窗口刷新_80 行 Python 代码写个图形计算器

    ↑ 关注 + 星标 ,每天学Python新技能 后台回复[大礼包]送你Python自学大礼 01 实现 我们几乎每个人都用过计算器,大家对于计算器应该都是比较熟悉的,计算器整体也是比较简单的,主要包括 ...

  3. python 之路,200行Python代码写了个打飞机游戏!

    先看一下项目结构 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 """ PlayPlane/ |-- bin/ |   |-- mai ...

  4. python 之路200行Python代码写了个打飞机游戏

    先看一下项目结构 \ """ PlayPlane/ |-- bin/ | |-- main.py 程序运行主体程序 |-- config/ | |-- settings. ...

  5. 50行的python游戏代码_50行Python代码写一个语言检测器

    你有没有曾经好奇过Chrome浏览器是如何知道一个网页的语言,并对外国文字的网页提供翻译服务的?或者,Facebook是如何翻译你朋友用写在你主页上的外国文字?检测一种语言实际上非常简单,改进了用户体 ...

  6. python抓包 windows_教你用100行Python代码写一个抓包工具

    现代计算机程序大部分时候离不开网络,作为开发者,在日常开发网络相关的程序或者排查程序错误时经常会用抓包工具来分析网卡收发的数据,比如著名的tcpdump,Wireshark等.今天我们尝试用100行左 ...

  7. 10 行 Python 代码写的模糊查询

    导语: 模糊匹配可以算是现代编辑器(在选择要打开的文件时)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列表供用户选择. 样例如下: Vim (Ctrl-P ...

  8. python代码壁纸-70行python代码实现壁纸批量下载

    前言 好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python.这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸. 注意:本文所属项目仅用 ...

  9. python 复制文件_10 行 Python 代码写 1 个 USB 病毒

    (给Python开发者加星标,提升Python技能) 转自: 知乎-DeepWeaver 昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有wind ...

  10. 不到70行 Python 代码,轻松玩转 RFM 用户分析模型(附案例数据和代码)

    作者 | 周志鹏 责编 | 刘静 本文从RFM模型概念入手,结合实际案例,详解Python实现模型的每一步操作,并提供案例同款源数据,以供同学们知行合一. 注:想直接下载代码和数据的同学可以空降文末 ...

最新文章

  1. 有名内部类 匿名内部类
  2. 机器学习 | 图像检索开源项目合集
  3. 冠军杜兰特和Deta比赛
  4. Xilinx 拥抱“新基建” 发力大中华区核心市场
  5. java文件传输之文件编码和File类的使用
  6. Mybatis中使用Dao实现类实现增删改查【实际开发中使用代理dao】
  7. 如何用Chrome读懂网站监测Cookie
  8. appium 处理滑动的方法
  9. SQL Server数据库partition by 与ROW_NUMBER()函数使用详解[转]
  10. 在CMakeLists.txt文件中包含Eigen
  11. 水凝胶 静电纺丝_【再生医学前沿】Nature子刊:静电纺丝玩出新花样!静电射流偏转的超快3D打印亚微米结构...
  12. 隐马尔可夫模型通俗导论
  13. 利用 SendInput 和INPUT结构 模拟鼠标移动
  14. Spring Cloud入门+深入(十二)-Gateway网关(一)
  15. 信号处理中使用IPP库函数的基本设置
  16. perf工具简介+火焰图制作与解读
  17. 设置水平线高度html代码是size,html水平线样式 Width:设置水平线的宽度
  18. 书中自有黄金屋系列5:读《正面管教》
  19. 第一次用idea写SSM框架的项目就遇到自动注入失败的问题
  20. 2.Python-简单数据类型

热门文章

  1. ubuntu22.04编译opengl编程指南示例
  2. 基于JAVA WEB的网上书店的设计与实现
  3. 小甲鱼老师目前所有视频教程下载地址(mark下来慢慢看系列)
  4. Delphi7·ProgressBar控件
  5. 星际2 BETA客户端背景音乐打包下载(附提取方法)
  6. 小米的过去、现在和未来
  7. ZooKeeper 客户端: GUI+命令行两大类(史上最全,值得收藏)
  8. 修改别人服务器数据库,修改别人服务器数据库
  9. 这是你所了解的FaaS 么?——无服务计算的10个思考
  10. easymule学习----校验dll信息