情人节 ,能否表白成功就看这段Python代码了
点击上方Python知识圈,选择设为星标
回复1024获取Python资料
作者:@明哥
公众号:Python编程时光
阅读文本大概需要 6 分钟
2020年,这个看起来如此浪漫的年份,你还是一个人吗?
难不成我还能是一条狗?
18年的时候,写过一篇介绍如何使用 Python 来表白的文章。
没有看过的,你可以点击这里查看:你还单身?Python 教你脱单
提醒你一下,今天就是 2月14日了。什么?还是一条狗呢?
行吧,那你赶上了,今天的文章,就是为你而写。
明哥今天来教你如何使用 Python 来向心中的女神表白。
前段时间,在微博上刷到了一条推荐。内容是这样的
出于好奇,我点开了,放大再放大,emmm,有点意思吖…
这四个字,对于像我这样腼腆的DS男来说,还真不好意思说,说出来,万一被拒绝了咋办?
使用套路来表白,并观察对方的反应,你大概能清楚对方是否对你也有好感,先测试下自己有几成的把握再下手或许更稳妥。
今天就教大家一个这样的套路:如何使用 Python 来做出来这样的图,有点浪漫,又有点极客。能不能拿下你女神,就要靠你(命)了。(๑•́₃ •̀๑)
首先,你得先找到一张你女神的高清图片(尽量分辨率高点的吧,效果会好点)。
这里我以一张高圆圆的图来做一下演示,原图是这样的(分辨率是:2000*1328)。
使用我写好的脚本运行后,就生成了这样一张图,请你点击,放大再放大。(惊喜?
然后将这张图片发给你的女神,具体话术你自己想咯。
好吧,相比女神来说,你可能更在意这是如何实现的(活该你单身)。
其实原理很简单,代码也还不到20 行。
首先,来讲讲原理。
事实上,每一张图片都是由一个一个的像素点所组成的。而每个像素点,都有自己的颜色,其颜色可以用一个数组来表示:(a,b,c),其中每位数的取值范围都是 0-255。
比如(0,0,0)代表黑色,(255,255,255)代表白色。
当像素点足够多的时候,这张照片就是我们所说的高清照片。
而如果当像素点太少,我们的肉眼就能感知到明显的锯齿感。
用 Excel 画了个图,每一方格代表一个像素,其中若我的字体的大小设置 5(非字号5,而是每个字占用5个像素),效果大概就是如下这样子。
我只要每个像素取出一个像素值,并使用这个像素做为该字的颜色即可,在像素量够多的情况下,从远处看,是能看到我们原来图像的轮廓的。
有了思路,就可以开始我们的代码。
首先,使用 pillow.Image读取图像,并使用load函数获取到每一个像素值。
img_raw = Image.open(img_path)
img_array = img_raw.load()
然后新建一张画布,并选好你要使用的字体和字体大小。
img_new = Image.new("RGB", img_raw.size, (0, 0, 0))
draw = ImageDraw.Draw(img_new)
font = ImageFont.truetype('C:/Windows/fonts/Dengl.ttf', font_size)
由于需要不断循环 “我喜欢你!”,这五个字符。所以这里可以while循环 yield 来实现一个生成器。
def character_generator(text):
while True:
for i in range(len(text)):
yield text[i]
最后,要给这些字加上相应的颜色,写入新创建的画布中。
for y in range(0, img_raw.size[1], font_size):
for x in range(0, img_raw.size[0], font_size):
draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)
最后将成品保存
img_new.convert('RGB').save("F://gyy_save.jpeg")
完整代码如下,供你参考
from PIL import Image, ImageDraw, ImageFont
font_size = 7
text = "我喜欢你!"
img_path = "F://gyy.jpeg"
img_raw = Image.open(img_path)
img_array = img_raw.load()
img_new = Image.new("RGB", img_raw.size, (0, 0, 0))
draw = ImageDraw.Draw(img_new)
font = ImageFont.truetype('C:/Windows/fonts/Dengl.ttf', font_size)
def character_generator(text):
while True:
for i in range(len(text)):
yield text[i]
ch_gen = character_generator(text)
for y in range(0, img_raw.size[1], font_size):
for x in range(0, img_raw.size[0], font_size):
draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)
img_new.convert('RGB').save("F://save.jpeg")
1. 路飞
2. 索隆
3. 山治
-----------------------公众号:Python知识圈(ID:PythonCircle)博客:www.pyzhishiquan.com知乎:Python知识圈bilibili:菜鸟程序员的日常
一个学习Python的人,喜欢分享,喜欢搞事情!长按下图二维码关注,和你一起领悟Python的魅力。
留言打卡 DAY 02
今日的留言话题是:分享下你对你的对象或者亲人做过的最浪漫的事情。关于留言打卡的规则可以参考今天的第二篇文章 (点击第二篇文章链接查看详细打卡规则),请按照 昵称+天数(请以自己实际打卡的天数为准,如day1 or day2 or day3)+ 留言内容(不少于15字)的方式留言。
Python知识圈公众号的交流群已经建立,群里可以领取 Python 和人工智能学习资料,大家可以一起学习交流,效率更高,如果是想发推文、广告、砍价小程序的敬请绕道!一定记得备注「交流学习」,我会尽快通过好友申请哦!通过好友后私聊我「学习资料」或者「进群」都可以。
扫码添加,备注:交流学习
往期推荐010203