思路来自于「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的相同目录下。

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

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

python制作表白软件手机版_用Python做一个情人节表白神器相关推荐

  1. 用python做一个表白软件手机版_用python写一个5.20的表白小程序吧

    (这两天老用matplotlib画那种很严肃的论文图,实在是很想偷偷画点儿别的放松下.) 恰好今天520,发现一个很美的数学公式. 这样的公式始祖来源于数学家笛卡尔的心形公曲线.而这背后是一个凄美的爱 ...

  2. python抖音表白软件手机版_教你用 Python 实现抖音热门表白软件

    之前在群里看到有人发了一个抖音上很火的小视频,就是一个不正经的软件,运行后问你是不是愿意做我的朋友,但你没法点击到「不同意」!并且没办法直接关闭窗口! 很不正经,很流氓,有点适合我. 效果大概是这样的 ...

  3. python写文字冒险游戏手机版_用128行代码实现一个文字冒险游戏

    哈喽大家好我是yumir 文字冒险游戏一直是一个广受欢迎的游戏类型,有小可爱问我有没有文字冒险游戏的制作思路,今天就分享一下,做一个简单的文字冒险游戏,只需要128行代码~ 这次我只做了文字显示和分支 ...

  4. java制作表白软件手机版下载_手机自己制作表白软件

    手机自己制作表白软件app是一款可让小伙伴们大胆无畏地进行表白的手机应用,用这款手机自己制作表白软件app软件小伙伴们再也不怕不知道该如何向心仪的人表白了,通关本应用可以生成很多表白的语言或图片,让表 ...

  5. 二三星缩水软件手机版_手机版的录音剪辑软件:清爽视频编辑APP

    大家在学习后期制作视频的过程中,总会遇到很多问题,从学习视频如何剪辑,学会了以后又学添加音乐,转场特效等等,学习不同的视频编辑功能让出来的成品更好.在不断摸索中会发现,好的视频都需要配音,加上配音视频 ...

  6. python制作表白神器_用Python做一个情人节表白神器

    思路来自于「Python 编程时光」,我在其之上改进了一下,主要是通过tkinter编写一个界面方便使用,大家可以关注「Python 编程时光」这一良心公众号. 本文最后给出了打包好的软件,无需安装P ...

  7. python核心编程第三版_《Python核心编程(第3版)》

    <Python核心编程(第3版)>是经典畅销图书<Python核心编程(第二版)>的全新升级版本,本书适合具有一定经验的Python开发人员阅读,总共分为3部分.第1部分为讲解 ...

  8. python制作的炫酷动画_用Python一键生成炫酷九宫格图片,火了朋友圈

    作为一个男同胞来说,为了给女朋友拍一张美美的照片,着实需要花费很大的时间和精力,不仅仅需要从众多的图片中精心挑选,而且还需要有着超强的图片精修能力,才能得到一张张达到女友要求的图片,真心不容易啊- 朋 ...

  9. 用python制作的游戏有哪些_用 Python 做个简单的井字游戏

    在这个教程中,我将展示如何利用Python来做一个井字游戏.这将包括函数.列表.if语句.while循环.for循环以及错误处理等等. 首先,我们将创建两个函数,第一个函数将会打印出井字游戏的背景模板 ...

最新文章

  1. C#------编码规范
  2. 【剑指offer-Java版】17合并两个排序链表
  3. IBM押注沃森人工智能技术 未来6年或达170亿美元
  4. 安装php5、卸载php、安装php7的教程
  5. tf.keras.preprocessing.image_dataset_from_directory() 简介
  6. 多参量最优化matlab,fmincon函数优化多个参数
  7. 原生javascript 元素依次掉落及上升
  8. Codeforces 793b B. Igor and his way to work 觉得大神写的3维bfs太复杂,突然发现这题是连连看算法。
  9. RxJs SwitchMapTo 操作符之移花接木
  10. SQLAlchemy 多态进阶(__mapper_args__ )、多对多标签
  11. Gin实践 番外 Golang交叉编译
  12. 【SQL】利用HAVING取众数和中位数
  13. EDIUS5.5快捷键大全
  14. java 正则表达式 compile_JAVA 正则表达式
  15. VB.NET模拟掷骰子
  16. off-by-onedoublefree. 看雪10月ctf2017 TSRC 第四题赛后学习
  17. VR广告:通过“虚拟房间”广告在VR中体验Lionsgate的JIGSAW
  18. win7系统 邮箱服务器搭建,win7搭建邮箱服务器
  19. Markdown学习记录 [ javaSE 基础Ⅰ] Day01
  20. Windows-Windows 10显示两个显示器,两个显示器都能分别显示

热门文章

  1. ajax machine tool,Machine Tool
  2. 基于javaweb高校教材管理系统的设计与实现
  3. 自动刷抖音极速版得红包金币(APP实现)
  4. 总结——STL 常用数据结构及用法
  5. 一、软件界面的设计——QT设计师换背景,一些按钮学习心得,转换成py文件遇到的问题
  6. 【PSTOOLS】PSEXEC 启动远程机器上的程序没有UI显示
  7. 用Matlab把 .txt文件中的16进制数据转换成2进制数据
  8. 金融网站知识图谱问答系统:自学Python第一周
  9. kdbx后缀文件打开
  10. (python)map,list,set删除元素