程序员|手把手教你用python来制作春联,是时候让你大展身手了

那是一个阳光明媚的午后,作为浑水摸鱼大师的我无意中一撇,突然发现了这么一篇文章:
用Python写春联:抒写最真诚的祝福和最美好的祈愿
这不是撞我枪口了嘛,反正闲着也是闲着,不如搞点事情。于是我兴致勃勃地喝了一杯茶
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

去look look。好家伙,原来是生成了对联的图片,那么问题来了有木有办法自动生成对联,然后再生成图片呢?
并且在本地部署咧。
于是我有个大胆的想法
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

基于RNN(Seq2Seq + Attention)生成对联(个屁) 没错我有个大胆的想法那就是,我们基于Seq2Seq + Attention来生成对联吧。然而
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

好吧看来我们得换一个思路了。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

呀呼,还真让我找到了。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

环境准备 好了不说废话了,让我们快速开始吧。 在此之前我们得准备一下我们的环境。 我这里使用的是python 3.8

pip install paddlepaddle pip install paddlehub #如果paddlehub安装失败的话,可以使用 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=100 paddlehubpip install pillow

功能分析 对联生成 得益于飞浆为我们提供的PaddleHub我们可以快速地实现我们需要的功能。于是我们可以这样封装一下我们的代码。
这个真没啥好说的。
import paddlehub as hubclass HubUtils(object): def __init__(self): self.hub = hub #初始化时需要加载模型,需要时间,饿汉加载吧,方便后面调用,但是给标题的比较特殊 self.module_love_words = self.hub.Module(name="ernie_gen_lover_words") self.module_poetry = self.hub.Module(name="ernie_gen_poetry") self.module_couplets = self.hub.Module(name="ernie_gen_couplet") def GetLoveWords(self,curx,size=5): # 生成情话,默认返回五个情话,这个传入list results = self.module_love_words.generate(texts=curx, use_gpu=True, beam_width=size) return results[0]def GetAcrostic(self,title,line=4,word=7,size=1): #默认返回一首,输入标题即可 self.module_acrostic = self.hub.module = hub.Module(name="ernie_gen_acrostic_poetry", line=4, word=7) results = self.module_acrostic.generate(texts=[title], use_gpu=True, beam_width=size) return results[0]def GetPoetry(self,curx,size=1): #输入关键句,词即可生成诗歌,默认一首 results = self.module_poetry.generate(texts=[curx], use_gpu=True, beam_width=size) return results[0]def GetCouplet(self,up_couplet,size=1): #输入上联给出下联,默认给一个 results = self.module_couplets.generate(texts=[up_couplet], use_gpu=True, beam_width=size) return results[0]if __name__=="__main__": Hub = HubUtils() print(Hub.GetCouplet("小母牛坐飞机")) print(Hub.GetCouplet("风吹云乱天垂泪"))

这里的话我还封装了几个比较有意思的训练好的模型。
图片生成 现在我们拿到了我们的对联,接下来要做的就是来生成一下我们的图片。
这个其实很简单,我们直接使用pillow在一张背景图片上写字就行,就像打水印一样。
不过在此之前我们得先选一个好看的字体。 这里我使用的还是Windows系统(没办法,很多环境配置都在Windows系统,除了平时办公室玩玩基本没玩了,而且现在还放寒假了…以前还玩kali来着的)
打开这个文件夹 C:\Windows\Fonts
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

咱们选一个好看的。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

来我们先来看看这个生成的效果
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

我们再给他美化一下,同时我们需要让我们的字竖起来。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

然后我们再绘制一些点,让它布灵布灵。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

class ImgUtils(object):def Set_Color(self): return random.randrange(255) def Pretty(self,dr,width,height): for i in range(800): # 绘制干扰点 dr.point(xy=(random.randrange((width)), random.randrange(height)), fill=(self.Set_Color(), self.Set_Color(), self.Set_Color()))def CreateImg(self,text,output_path="output.png", fontPath = r"C:\Windows\Fonts\STXINGKA.TTF",show=True, fontSize = 55,pretty=True): #正常情况下的文字 lens = len(text) # 画布颜色 im = Image.new("RGB", (fontSize * lens + 20, (fontSize + 20)), (255, 0, 0)) dr = ImageDraw.Draw(im) font = ImageFont.truetype(fontPath, fontSize) #美化 if(pretty): self.Pretty(dr,fontSize * lens + 20,(fontSize + 20))# 文字颜色 dr.text((10, 10), text, font=font, fill="black") im.save(output_path) if(show): im.show()def CoupletImg(self,text,output_path="output.png", fontPath = r"C:\Windows\Fonts\STXINGKA.TTF",show=True, fontSize = 55,pretty=True):lens = len(text) words = list(text) # 画布颜色 im = Image.new("RGB", ((fontSize + 20),fontSize * (lens+1) + 20), (255, 0, 0)) dr = ImageDraw.Draw(im)font = ImageFont.truetype(fontPath, fontSize) #美化 if(pretty): self.Pretty(dr,(fontSize + 20),fontSize * lens + 20) # 文字颜色 step = 10 for word in words: dr.text((10, step), word, font=font, fill="black") step +=10+fontSize im.save(output_path) if (show): im.show()

程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

调用
之后就是咱们调用啦。
from utils import ImgUtils,HubUtilsdef main(): Hub = HubUtils() imgUtils = ImgUtils()up_couplet = "漂亮小姐姐" down_couplet = Hub.GetCouplet(up_couplet)[0] imgUtils.CoupletImg(up_couplet,output_path="up_couplet.png") imgUtils.CoupletImg(down_couplet, output_path="down_couplet.png")if __name__ == '__main__': main()

效果
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

貌似好像翻车了
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

总结 这次也是我第一次写科普类型(难度)的文章,如有不足多多指教(开个玩笑,本次的内容是很简单的,只是调调训练好的模型罢了)
另外提前祝大家新年快乐~
目前python发展前景最好,下面有一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

【程序员|手把手教你用python来制作春联,是时候让你大展身手了】这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。
程序员|手把手教你用python来制作春联,是时候让你大展身手了
文章图片

    推荐阅读