Hello,大家好,我是wangzirui32,今天就是虎年春节了,先祝大家虎虎生威,虎年大吉!愿大家在新的一年里万事如意,心想事成!

文章目录

  • 1. 普通版本
    • 1.1 引入所需模块
    • 1.2 生成春联单字图片
    • 1.3 拼接单个字图并调整格式
    • 1.4 运行代码
  • 2. Web版本
    • 2.1 Flask后台
    • 2.2 HTML前端
    • 2.3 效果展示
  • 3. 爬虫版本
    • 3.1 引入所需包
    • 3.2 获取春联信息
    • 3.3 批量生成春联
    • 3.4 运行程序

1. 普通版本

思路如下:

  1. 用户输入一个春联
  2. 程序接收春联,并分割为单个字
  3. 对这些字生成背景图
  4. 将背景拼接,调整格式,就结束了

春联单字背景素材:

字体文件下载:
http://www.diyiziti.com/Download/498
点击页面上的“下载地址”就可以开始下载了,下载完成后,请把它改名为font.ttf,并和上面的素材一样存储到项目文件夹,再创建app.py,开始写代码。

1.1 引入所需模块

from PIL import Image, ImageDraw, ImageFont

PIL安装:

pip install pillow

1.2 生成春联单字图片

这里为了方便,把整个生成春联的流程都放到了create_couplet_image函数下:

def create_couplet_image(content):sentences = content.split()   # 以空格分隔images = []   # 每个句子图像font_path = "font.ttf"font = ImageFont.truetype(font_path, size=150)  # 字体大小150for sentence in sentences:sentence_images = []for word in sentence:word_image = Image.open("bg_image.png")draw = ImageDraw.Draw(word_image)draw.text((55, 45), text=word, font=font, direction=None, fill="#000000")sentence_images.append(word_image.resize((100, 100)))images.append(sentence_images)# images的结构:# images = [句子1, 句子2]# 句子1 = [字1, 字2, 字3, ....., 字n]# 句子2同理# 每个字都是图形对象

1.3 拼接单个字图并调整格式

def create_couplet_image(content):# .......# 省略上方代码height = len(images) * 100  # 高 = 句子数量 * 100width = len(images[0]) * 100  # 宽 = 句子长度 * 100# 新建一个图像 背景为白色couplet_image = Image.new("RGB", (width, height), (255, 255, 255))# 拼接x = 0y = 0for sentence_image in images:x = 0for word_image in sentence_image:couplet_image.paste(word_image, (x, y))  # 把单个字的图片插入(x, y)的位置x += 100y += 100return couplet_image  # 返回图片对象

1.4 运行代码

请在函数之外的文件末尾新增代码:

if __name__ == "__main__":create_couplet_image(input("请输入春联内容:")).save("couplets.png")

测试:

请输入春联内容:一年好景随春到 四季财源顺意来

春联图片:

这就完成了一个普通版本,如果想进阶学习,可以参考接下来的衍生版本。

2. Web版本

Web版本为普通版本设计了一个外观简洁的网站界面,流程如下:

  1. 用户访问首页
  2. 用户输入春联内容
  3. 用JS脚本提交到后台
  4. 展示春联图片
  5. 用户下载后删除

这里涉及到一些前端知识和Flask框架的开发,有兴趣的小伙伴可以继续阅读。
首先,在普通版本的项目文件夹下创建website.py,再创建templatesimages文件夹,在templates文件夹下创建index.html

2.1 Flask后台

website.py

from app import create_couplet_image
from flask import Flask, render_template, request, abort, make_response
import time
import osapp = Flask(__name__)  # 建立Flask应用# 工作目录 避免路径问题
work_dir = os.path.abspath(os.path.dirname(__file__))# 首页
@app.route("/")
def index():return render_template("index.html")# 生成春联
@app.route("/couplet", methods=['POST'])  # 仅支持POST请求
def couplet():content = request.form.get("content", None, type=str)  # 从表单中获取内容if content:timestamp = int(time.time())# 以时间戳作为文件名保存create_couplet_image(content).save(os.path.join(work_dir, r"images\{}.png".format(timestamp)))return {"image_id": timestamp}  # 返回图片信息else:abort(400)@app.route("/image/<id>")
def image(id):try:with open(os.path.join(work_dir, r"images\{}.png".format(id)), "rb") as img:image_bytes = img.read()  # 读取图片字节except FileNotFoundError:abort(404)else:# 返回图片 response = make_response(image_bytes)response.headers['Content-Type'] = 'bytes'if request.args.get("is_downloading", False, type=bool):# 删除图片 os.remove(os.path.join(work_dir, r"images\{}.png".format(id)))return responseif __name__ == "__main__":app.run()

2.2 HTML前端

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>生成春联在线系统</title><!-- 引入jQuery3.6.0 --><script src="https://code.jquery.com/jquery-3.6.0.js"></script><!-- 引入Boostarp3.4.1 --><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
</head>
<body><div class="container"><h1 class="page-header">生成春联在线系统</h1><script>image_id = "";create_couplet = function(){  // js提交到后台$.ajax({url: "{{url_for('couplet')}}",type: "POST",async: false,    // 禁止异步data: {content: $("#content").val()},success: function(data){image_id = data.image_id;  // 设置image_id的值}});};show_couplet = function(){    // 展示春联$("#couplet-form").remove()   // 删除表单var show_couplet_div = $("#show-couplet");// 信息生成show_couplet_div.append('<img src="/image/' + image_id + '" class="img img-rounded" />');show_couplet_div.append("<hr>");show_couplet_div.append("<p>以上为春联效果图,请查看。</p>");show_couplet_div.append("<p>注:下载一次后,服务器便会删除春联文件。</p>");show_couplet_div.append("<button class='btn btn-primary' οnclick='download(image_id);'>下载</button>");show_couplet_div.append("&nbsp;&nbsp;")show_couplet_div.append("<button class='btn btn-primary' οnclick='window.location.reload();'>再生成一幅</button>");};download = function(){   // 下载window.location.href = "/image/" + image_id + "?is_downloading=1";};</script><form class="form-group" onsubmit="return false;" method="POST" id="couplet-form"><div class="input-group" style="width: 500px"><span class="input-group-addon" style="height: 40px;">春联内容:</span><input type="text" class="form-control" style="height: 40px;" placeholder="两句请用空格隔开......" id="content"></div><p style="height: 13px;"></p><button type="submit" class="btn btn-primary" onclick="create_couplet();show_couplet();">提交</button></form><div id="show-couplet"></div></div>
</body>
</html>

2.3 效果展示


3. 爬虫版本

这个版本我们要运用爬虫技术,自动爬取并生成春联。
思路:

  1. 获取用户输入的爬取页数
  2. 调用百度汉语接口获取春联数据
  3. 解析春联数据,删除干扰的符号
  4. 将所有春联保存到一个文件夹中

首先,创建crawler.py,创建couplets文件夹存储春联。

3.1 引入所需包

from app import create_couplet_image  # 之前app.py文件的生成函数
import requests
import os

requests是用来实现网络请求的库,安装命令:

pip install requests

3.2 获取春联信息

# 工作目录 为了避免出现路径错误
work_dir = os.path.abspath(os.path.dirname(__file__))
# 百度汉语查询接口
url = "https://hanyu.baidu.com/hanyu/ajax/motto_list?wd=春联&device=pc&from=home&ptype=sentence&pn={}"# 获取春联
def get_couplets(page=1):response = requests.get(url.format(page))  # 拼接网址并请求couplets_list = []for result in response.json()['ret_array']:  # 获取结果couplets_list.append(result['name'][0])  # 春联内容return couplets_list  # 返回数据

3.3 批量生成春联

def create_couplets(couplets):for i in couplets:# 过滤一些符号couplet = i.replace(";", " ")   # 注意这里是" "couplet = couplet.replace(",", "")  # 其他都是""couplet = couplet.replace("。", "")couplet = couplet.replace("、", "")# 生成并保存到couplets文件夹create_couplet_image(couplet).save(os.path.join(work_dir, r"couplets\{}.png".format(couplet)))

3.4 运行程序

请在文件结尾添加:

if __name__ == "__main__":page = int(input("请输入你想获取的页数:"))for i in range(1, page+1):   # page控制获取页数create_couplets(get_couplets(i))

运行代码:

请输入你想获取的页数:1

couplets文件夹:

其中一幅春联:


好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!

Python番外篇:Python代码生成春联 三种版本相关推荐

  1. 机器学习番外篇—朴素贝叶斯三种模型(多项式,高斯,伯努利)

    朴素贝叶斯三种模型(多项式,高斯,伯努利) 高斯 有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值,比如如果身高在160cm以下,特征值为1:在160cm和170cm ...

  2. Python番外篇:网络爬虫组词程序

    今天,双是番外篇,这次番外篇主要教大家如何用网络爬虫查询词语. 1.确定数据源 首先,我们得找一个查询的数据源,我找到了360国学网站,选择"词语大全",它的查询词语网址为: ht ...

  3. Python番外篇:爬取CSDN作者排行榜数据

    今天,又双叒叕是番外篇,我们来爬取CSDN作者排行榜上的数据. 1. 确定数据源 首先,排行榜的网页链接是https://blog.csdn.net/rank/list/total: 打开" ...

  4. 落枕学python—番外篇(1)

    前言 上次写过了两篇啊,那么这次我先缓一缓,先写一个番外,但这不等于些废话,我还是要说一点实质性内容的,废话不多说,咱们先开始哈. 一.Python有什么好? 咱们既然学,就要知道我们为什么要学. 第 ...

  5. 【Python100天学习笔记】番外篇 Python面试面经、笔试题目汇总

    Python面试题汇总 说明:下面的内容源于GitHub上名为interview_python的项目,对其内容进行了修订和补充. 文章目录 Python面试题汇总 Python语言特性 1 Pytho ...

  6. 用python内置函数算复杂度吗_番外篇: Python 面试感受

    醒来有人说我刁难面试者, 我来解释一下, 我的面试环节一般是最后一个环节才会进行 python 基础的面试. 之前都是项目交流, 进入到最后这个环节的, 都是我认为项目 OK 的, 我对他的能力也是认 ...

  7. python应用实例论文_番外篇——Python多进程应用实例一则

    前言: 现在的电脑普遍进入多核时代,当我们需要做一些计算密集型任务时,运用并行计算能够发挥CPU的性能,也够大大的节省我们的时间.在现在的数据挖掘中,Python是一门非常强大的语言,语法直接明了,易 ...

  8. python 按键精灵 离线_(番外篇)Python操纵网盘客户端批量离线下载电影

    上回(Python实现电影排行榜自动网盘下载(4)Cookies免登录+抓包下载)说到,一段时间内能进行多少次离线下载还是受限于验证码的输入. 在此有两个解决方案, 见招拆招 通过GUI优化验证码输入 ...

  9. 关于多线程的那点事之番外篇 -Python

    上一篇:关于多线程的那点事 -Python 哈喽各位小伙伴,很快啊,小泽马上就又更新了,速度简直不要太快! 上回咱们不是说了怎么开多线程嘛,那同样的,还有一个问题: 公司已经下班了,但是员工还在努力工 ...

最新文章

  1. 17-flutter导航栏渐变效果
  2. 一些思考,没想好标题
  3. 分享一些好用的 Chrome 扩展
  4. 上篇 | 如何设计一个多轮对话机器人
  5. C语言简单的日期校验函数
  6. 安装并配置oracle11g,ORACLE11g 安装于基本配置说明
  7. matlab fopen函数的用法,matlab中关于fread函数的用法
  8. 打破传统内容生产 易车玩转综艺原创
  9. Spark利用(idea+maven+scala)创建wordcount打包jar并在spark on yarn上运行——Spark的开发
  10. Python-Numpy语法总结-数组的创建
  11. html滚动字幕怎么设置大小,视频画面顶部加一行滚动字幕设置字体大小颜色 滚动显示控制次数...
  12. Eclipse下Hibernate使用学习
  13. 树莓派修改root密码
  14. 高速电路常用的信号完整性测试手段与仿真
  15. ThinkPHP一键检测ThinkPHP漏洞,漏洞检测工具
  16. Iptables入门
  17. Python下载库pip pygame
  18. 举个栗子!Tableau 技巧(105):用 四象限图 对数据进行分类分析
  19. “90后”男子酒后乱性强奸醉酒女获刑3年
  20. SQLServer 连接不上 找不到网络路径

热门文章

  1. MacDown 编辑器 使用
  2. WebSocket实现简单聊天功能案例
  3. GB/T28181 视频预览如何选择主码流还是子码流
  4. TiDB Binlog部署
  5. ftp工具 64位,推荐8款好用的ftp工具 64位,ftp中文客户端下载
  6. 【个人话唠】兴趣让我们走到了一起
  7. 代码技巧——数据迁移方案【建议收藏】
  8. 获取全组合算法,比如输入A,B,C 得到A、B、C、AB、AC、BC、ABC
  9. WinEdt插入数学公式
  10. Android 设置横屏,竖屏或者禁止横屏的方法