查看原文
其他

过年啦,用Python绘制一幅属于你的春联吧!

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:赵一帆,中南财经政法大学金融学院

本文编辑:冀思慧

技术总编:王子一

Stata&Python云端课程来啦!

      为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程Stata文本分析正则表达式网络爬虫基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~



引言

     “爆竹声中一岁除,春风送暖入屠苏。千门万户曈曈日,总把新桃换旧符。”每逢春节,家家户户都要挑漂亮的红春联贴于门上,辞旧迎新,增加喜庆的节日气氛。新年送福,下方就是使用Python程序生成的福字哟,希望能给大家带来好运和幸福~想知道怎么使用Python绘制福字和春联吗,一起来看看吧!


一、导入第三方库

首先,我们需要导入几个必需的第三方库:iopillownumpyrequests库。io模块是电脑自带的模块,它包含着两种类文件对象:StringIOBytesIO,可以把数据保存在内存中,可以像文件一样被操作;pillow是基于PIL模块fork的一个派生分支,现在已经发展成为比PIL本身更常用的图像处理库。如果之前你的电脑没有安装过这几个第三方库,应先使用命令pip install进行安装。

#导入第三方库import io#从pillow库中导入Image模板from PIL import Image import numpy as npimport requests
tip:PillowPIL不能在同一个环境中共存。如果之前你的电脑有PIL,安装Pillow之前,请先卸载PIL
二、下载春联所需的字体及背景图片

第二步,我们需要获取单个汉字的图片,定义函数的参数中ch表示单个汉字,quality表示单字分辨率,H为640像素,L为320像素。接着我们利用requests库从网络上的字体库下载图片,再使用类文件对象BytesIO存储Bytes类型的数据。这时我们才可以使用Image模块打开使用类文件对象存储的数据,再根据单字分辨率的不同对下载图片的宽度和高度(width, height)进行更改并设置新的返回值。字库中包含一个“龙凤呈祥”的背景,这里我们可以直接导入。

代码如下:
#导入字库中的字体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 == '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)
三、绘制春联
下一步就是最重要的一步,即绘制春联。一起接着来看看我们需要怎么做吧~
我们定义一个生成春联的函数,参数text表示春联的内容,以空格断句;HorV为字体的排列方式,H为横排,V为竖排;out_file为生成的文件名;bg为春联的背景,后面为图片所在的文件路径。usize定义的是对于高低分辨率的两种尺寸;text_list是对输入的文本text以空格为分隔符进行分隔的列表,rowstext_list中的列表个数;cols指的是列表中每个元素的最长长度。我们实际操作过程的逻辑就是:先根据我们输入的文本长度以及列数,生成所需春联尺寸的白色底色图。然后确定背景图和字体的位置,粘贴汉字和龙凤呈祥背景图并把汉字放在背景图上方。
具体代码如下:
#定义绘制春联的函数def write_couplets(text, HorV='V', quality='L', out_file=None): bg_im = get_bg(quality) usize = {'H': (640, 23), 'L': (320, 12)} 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='V', quality='H', out_file='福字.jpg')text = '民安国泰逢盛世 风调雨顺颂华年'write_couplets(text, HorV='V', quality='H', out_file='春联01.jpg')text ='一帆风顺吉星到 万事如意福临门'write_couplets(text, HorV='V', quality='H', out_file='春联02.jpg')text = '爬虫俱乐部成员 恭祝大家新年好'write_couplets(text, HorV='H', quality='H', out_file='春联03.jpg')
前两个案例输出的结果就是文章前面展示的福字和春联“民安国泰逢盛世 风调雨顺颂华年”,后面的春联我们分别采用竖向排列和横向排列,输出的图片如下:

最后,以这幅春联送给诸位,恭祝大家虎年行大运,平安健康,心想事成!

END

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


腾讯课堂课程二维码








            



 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!












往期推文推荐        登上爬虫俱乐部“时光机” |上“机”出发 开启一段奇妙之旅

        Stata中的小清新命令——添加观测值

        PCA(主成分分析法)降维——Python实现

       超好用的事件研究法

        如何绘制任泽平《鼓励生育基金》的几幅图

        Python 第六天——字符串

        findname——想要什么找什么

        Python字符串之“分分合合”

        PDF转docx可批量操作?——wordconvert的小技巧

        考研之后,文科生需以“do”躬“do”!

       手绘五星兴家国——用Stata绘制五星红旗

        Seminar丨董事会的性别多样化和企业创新:来自国际的证据

       Python与数据库交互——窗口函数

        Stata之post命令——数据邮递 

        爬虫俱乐部成员的Stata学习经验分享来啦!

       Seminar丨2002年萨班斯·奥克斯利法案的经济后果

        我几乎画出了“隔壁三哥”家的国旗

        Python基础——三大数字类型,你都了解吗?
        如何用Stata绘制带指向性箭头标注的图像       
       Seminar丨荐仆贷款——19世纪中国的信任辅助贷款       【技能篇】多进程队列间通信

Seminar丨公司董事会的人才增长:来自中国的证据

正则表达式--懒惰模式

爬完独立董事的年薪,我的眼镜跌破了!识别旅游“照骗”——看风景名胜是否名副其实主成分分析的Python实现

正则表达式--贪婪模式

Seminar丨谁更重要:高管股权薪酬与财务报告欺诈DOS能量,超乎你想象!

爬虫实战丨走进哈利波特的魔法世界

数据集合并的新路子-frlink命令

Seminar丨附近的公司:利用卫星图像研究本地信息优势

线性同余法生成伪随机数 

[技能篇]多线程爬虫

“好哭”是衡量一部好电影的标准吗?

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存