思路来自于「Python 编程时光」,我在其之上改进了一下,主要是经过tkinter编写一个界面方便使用,你们能够关注「Python 编程时光」这一良心公众号。python
本文最后给出了打包好的软件,无需安装Python环境和各类依赖,直接下载软件,解压后,双击exe文件便可使用。git
先来看一下具体的效果。github
运行程序。编程
点击「选择图片」 选择JPG/JPGE/PNG三种中任意一种格式的图片,而后点击生成表白图片则可。windows
好比我选择了一张「进击的巨人」图片,其生成效果以下。数组
将图片放大看看,会发现图片所有由「我喜欢你!」构成。框架
咱们知道图片由不一样的像素组成,每一个像素都有本身的颜色,经过RGB来表示,如图。字体
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的相同目录下。
连接:pan.baidu.com/s/1y0633mzo… 关注「懒编程」回复「表白」获取提取码
程序的完整代码也开源放在了github,连接为:github.com/ayuLiao/ILo…
若是文章对你有帮助,点个「在看」吧,让更多人知道我。