这段 Python 代码,可以让你脱单

共 4454字,需浏览 9分钟

 ·

2020-02-13 23:21


阅读本文大概需要 3 分钟。


昨天的时候,看到了明哥在群里发的一篇文章,情人节来了,教你个用 Python 表白的技巧,里面写了怎么来做一张神秘的表白图片,感觉写的很有意思,技术也非常值得研究,正好研究了说不定大家也能用得上。


看完文章后,我也亲自实验了一下,制作了一张专属给女朋友表白的图片发给了她,嘿嘿!超级开心!小马情人节快乐!


下面是明哥的原文,最最后还有我的补充,大家一定一定一定要看到最后哦。


63911bc3511950a16fb6b5db29508c49.webp

作者@明哥
公众号Python编程时光

2020 年,这个看起来如此浪漫的年份,你还是一个人吗?

难不成我还能是一条狗?

18 年的时候,写过一篇介绍如何使用 Python 来表白的文章。

虽然创意和使用效果都不错,但有一缺点,这是那个 exe 文件,女神需要打开电脑,才有可能参与进来,进而被你成功"调戏”。

由于是很早期的文章了,应该有很多人没有看过。

没有看过的,你可以点击这里查看:用Python写一个表白神器让你脱离单身

提醒你一下,后天就是 2 月 14 日了。什么?还是一条狗呢?

行吧,那你赶上了,今天的文章,就是为你而写。

明哥今天来教你如何使用 Python 来向心中的女神表白。

前段时间,在微博上刷到了一条推荐。内容是这样的

c8f7bddc28b62de33e6b5cd94f35e9b9.webp

出于好奇,我点开了,放大再放大,emmm,有点意思吖…

b603b3508da958b60a989e70c72b9237.webp

这四个字,对于像我这样腼腆的 DS 男来说,还真不好意思说,说出来,万一被拒绝了咋办?

此处补充:把图片放大放大再放大,你就能看到秘密。

使用套路来表白,并观察对方的反应,你大概能清楚对方是否对你也有好感,先测试下自己有几成的把握再下手或许更稳妥。

今天就教大家一个这样的套路:如何使用 Python 来做出来这样的图,有点浪漫,又有点极客。能不能拿下你女神,就要靠你(命)了。(๑•́₃ •̀๑)

首先,你得先找到一张你女神的高清图片(尽量分辨率高点的吧,效果会好点)。

这里我以一张高圆圆的图来做一下演示,原图是这样的(分辨率是:2000*1328)。

63911bc3511950a16fb6b5db29508c49.webp

使用我写好的脚本运行后,就生成了这样一张图,请你点击,放大再放大。(惊喜?

7c4111750b02c89f5850f5cd811aef3b.webp

然后将这张图片发给你的女神,具体话术你自己想咯。


好吧,相比女神来说,你可能更在意这是如何实现的(活该你单身)。

其实原理很简单,代码也还不到 20 行。

首先,来讲讲原理。

事实上,每一张图片都是由一个一个的像素点所组成的。而每个像素点,都有自己的颜色,其颜色可以用一个数组来表示:(a,b,c),其中每位数的取值范围都是 0-255。

比如 (0,0,0) 代表白色,(255,255,255) 代表黑色。

当像素点足够多的时候,这张照片就是我们所说的高清照片。

而如果当像素点太少,我们的肉眼就能感知到明显的锯齿感。

用 Excel 画了个图,每一方格代表一个像素,其中若我的字体的大小设置 5(非字号 5,而是每个字占用 5 个像素),效果大概就是如下这样子。

58628213c07090e7e37e7a45ea73e471.webp

我只要每个像素取出一个像素值,并使用这个像素做为该字的颜色即可,在像素量够多的情况下,从远处看,是能看到我们原来图像的轮廓的。

有了思路,就可以开始我们的代码。

首先,使用 pillow.Image 读取图像,并使用 load 函数获取到每一个像素值。

img_raw = Image.open(img_path)
img_array = img_raw.load()

然后新建一张画布,并选好你要使用的字体和字体大小。

img_new = Image.new("RGB", img_raw.size, (000))
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, (000))
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. 路飞

7230597e869fc85a9691b5aefd998f37.webp


2. 索隆

149658009f829b7e81329bd6c19a5f0b.webp


3. 山治

1fb894ee06ad055bb060232b2884ea16.webp


接下来是我(崔庆才)补充的内容了。


看完之后,我复制下来也来了一段。其中明哥里面有使用一个字体文件,我这边没有这个字体,于是我就自己下载了一个「阿里巴巴普惠体」,大家如果没有的话可以自行来下载,或者大家有中文字体文件也可以直接用,或者直接到我改好的源代码这里来取:https://github.com/Germey/TextImage,里面我上传了这个字体文件。


另外我修改成了支持批量处理的方式,如果你有很多张图片,可以放到 inputs 文件夹下,它会顺次处理并输出到 outputs 文件夹下,就不用再一个个定义图片名称啦。


我还增加了一个参数叫做 font_space,原来的代码生成的字可能有点紧凑,这里我增加这个参数可以控制字和字的距离,比如 font_space = 1,字间距就是字的大小,就是紧密排布的,如果改大一点,比如 font_space = 1.2,字间距就会变成字的 1.2 倍,就留有字大小的 0.2 倍的空隙。


最终代码如下:

from PIL import Image, ImageDraw, ImageFont
from glob import glob
from os.path import basename, join

# 字体大小
font_size = 8
# 字体间距,1 即间距正好为字体大小,紧凑排布,1.2 为字体大小的 1.2 倍
font_space = 1.2
# 绘制的文本
text = '老婆我爱你'
# 字体文件的路径
font_file = 'Alibaba-PuHuiTi-Regular.ttf'
# 输入图片路径
inputs_folder = 'inputs'
# 输出图片路径
outputs_folder = 'outputs'def process(path):
img_raw = Image.open(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(font_file, size=font_size)

def character_generator(text):whileTrue:
for i in range(len(text)):
yield text[i]

ch_gen = character_generator(text)

for y in range(0, img_raw.size[1], int(font_size * font_space)):
for x in range(0, img_raw.size[0], int(font_size * font_space)):
draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)

img_new.convert('RGB').save(join(outputs_folder, basename(path)))

if __name__ == '__main__':
for path in glob(join(inputs_folder, '*')):
print('starting processing', path)
process(path)
print('finished processing', path)

来吧,到了 show 图的时候了。


准备好了吗?


来了来了。



780f00581003cc9fbae1e6a72a8c941c.webp

40139c3fe6a04b98f4a2f5ca5c4145a9.webp

8640b3580563f17b1afc0a62152d5ab2.webp

5a1e30c7007675c173408ae50cb9db5c.webp

结果如下:



7fd51ef28786900321ec3133ced9ee96.webp

27389a2db55a44ac303f09fb0196afa6.webp

98fb4b518a3bf4f68aa058addef4724e.webp

7753f647fa5594822e80a90581311e47.webp


啊!你看!既可以写原创又可以秀女朋友照片!天啊生活怎么这么幸福!

美滋滋!


说干就干,我把照片发给了女朋友想得到她的一句夸奖。


c368a11071dae00c2218e1086c9926cc.webp

6af8beeeaca6c9f5fc3f9e09b9896587.webp




ee7b781ce52f1a5f32900578a966171b.webp


那,那好吧...

be812a3fb3dbe4c72ef36dd74e502d69.webp



哈哈,最后,纪念一下,我们在一起 465 天啦,正好 1 年零 100 天。在这里,就提前发这篇文章祝我们情人节快乐啦!


f90c30bfa69aa7062f2cc421bf8b371b.webp


最后忘了,大家赶紧也来试试吧!


fa135218bb2e87dc3470f41081d90f59.webp





崔庆才

静觅博客博主,《Python3网络爬虫开发实战》作者

隐形字

个人公众号:进击的Coder

89a1fc803f144fd281cd0b4ccff2f2da.webpc890196b0b2833ef4ee319b3515993ce.webp

长按识别二维码关注




好文和朋友一起看~
浏览 39
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报