用 Python 做一个情人节表白神器

思路来自于「Python 编程时光」,我在其之上改进了一下,主要是通过 tkinter 编写一个界面方便使用,大家可以关注「Python 编程时光」这一良心公众号。

本文最后给出了打包好的软件,无需安装 Python 环境和各种依赖,直接下载软件,解压后,双击 exe 文件即可使用。

先来看一下具体的效果。

运行程序。

点击「选择图片」 选择 JPG/JPGE/PNG 三种中任意一种格式的图片,然后点击生成表白图片则可。

比如我选择了一张「进击的巨人」图片,其生成效果如下。

将图片放大看看,会发现图片全部由「我喜欢你!」构成。

编码时刻

我们知道图片由不同的像素组成,每个像素都有自己的颜色,通过 RGB 来表示,如图。

  原理图出自easyai

RGB 本身就是一个数组:(a,b,c),数组中的每一位的取值范围都是 0~255,比如黑色可以通过 (0,0,0) 来表示。

我只需要将图片中每个像素的 RGB 值都取出,并使用这个 RGB 值作为字体的颜色则可,这样生成的图片从远处来看依旧会是原本图像的轮廓。

有了具体的思路,就可以编写代码了。完整代码在文末,这里先看关键代码片段理解思路。

在 Python 中可以通过 PIL 来实现对图片的各种操作。

首先安装一下 PIL。

pip install pillow

PIL 消极维护,一群爱好者 fork 了 PIL 的代码,并在其之上进行维护与修改,fork 后的代码项目称为 pillow。

首先,通过 PIL.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('SimHei.ttf', font_size)

最后就是循环 img_raw 并将图像像素数组对应的值赋值给字体,作为字体的颜色。

for y in range(0, img_raw.size[1], font_size):
    for x in range(0, img_raw.size[0], font_size):
        # 绘制文字并赋值颜色,具体为fill参数
        draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)

至此大功告成。

是否可以再优化一下?

为了让没有编程经验的朋友可以轻松使用,我决定用 tkinter 做一个简陋的界面,再使用 pyinstaller 进行打包,让各位无需安装 Python 环境与 PIL,直接开箱即用。

tkinter 是 Python 内置的桌面应用框架,相比于 PyQT5,它更加轻便,但功能也更加简陋,但用于开发表白神器已经足够了,tkinter 内置于 Python,不行安装,直接使用。

这里同样给出部分代码,完整代码看文末。

首先创建一个界面。

self.window = window
self.window.title('表白神器')
self.window.geometry('300x200')
menubar = Menu(self.window)

然后定义两个按钮与对应的响应方法。

# 选择图片
btn1 = Button(window, text='选择图片', width=15, height=2, command=self.get_img)
btn1.pack()

# 生成图片
self.send_btn = Button(window, text='生成表白图片', width=15, height=2, command=self.gen_img)
self.send_btn.pack()

当点击选择图片按钮时,get_img 方法会被调用,具体代码如下。

def get_img(self):
   global IMGPATH
   # 选择文件
   filenames = askopenfilenames(filetypes=(("jpeg img", "*.jpeg"), ("jpg img", "*.jpg"), ("png img", "*.png")))
   if len(filenames) > 0:
       fnlist = [fn for fn in filenames]
       fnstr = '\n'.join(fnlist)
       self.l.config(text=fnstr) # 显示选择了什么文件
       IMGPATH = fnlist
   else:
       self.l.config(text='目前没有选择任何图片文件')

上述代码中,get_img 方法通过 tkinter 的 askopenfilenames 方法打开系统的文件选择框,通过 filetypes 参数指定可以选择的文件类型,最终该方法会返回该文件完整的文件路径。

点击生成图片时,会调用 gen_img 方法,该方法就是调用前面编写好生成图像的方法,不再赘述。

最后

为了方便他人使用,我通过 pyinstaller 将表白程序打包。windows 下的朋友可以直接下载,然后解压使用,找到压缩文件中的 loveyou.exe,双击运行则可使用。

注意:表白图片会生成在 loveyou.exe 的相同目录下。

链接:https://pan.baidu.com/s/1y0633mzoodj2R-wNfXUCSw 关注「懒编程」回复「表白」获取提取码

程序的完整代码也开源放在了 github,链接为:https://github.com/ayuLiao/ILoveYouPic。

如果文章对你有帮助,点个「在看」吧,让更多人知道我。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒编程-二两

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值