python如何把一张图像的所有像素点的值都显示出来_情人节,教你用 Python 向女神表白...

点击上方 “AirPython”,选择 “加为星标”

第一时间关注 Python 技术干货!

87689f2321214e9057fcb2ab26e02d2b.png

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

难不成我还能是一条狗?

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

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

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

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

eb112a2196aec841038b18b1f247f7da.png

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

ad98cb8b870238687fd742b59f9afc7d.png

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

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

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

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

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

3377d1ca17bd3b97916eed4af3aa6cf2.png

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

d6b6d98e4a83fd3e2f27e27778da92e5.png

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


好吧,相比女神来说,你可能更在意这是如何实现的。

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

首先,来讲讲原理。

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

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

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

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

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

0e0406f99550070f89c30280002e9d22.png

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

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

首先,使用 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. 路飞

800b638b12cecc848dfa5aafe069aa50.png

2. 索隆

fd5918c243e56587a521963ce1d3e4fb.png

3. 山治

917b2ae465b63b129bb84ccf36ce1fb5.png

推荐阅读如何用 Python 自动化在工作中摸鱼这款黑科技,不会代码也能玩自动化,高效摸鱼自动化篇 | 再也不用担心老人们用智能机了0089e73dd8b48b2a11317cd183b497fc.pngTHANDKS- End -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring事务管理接口

Spring 的事务管理是基于 AOP 实现的,而 AOP 是以方法为单位的。Spring 的事务属性分别为传播行为、隔离级别、只读和超时属性,这些属性提供了事务应用的方法和描述策略。 在 Java EE 开发经常采用的分层模式中,Spring 的事务处理位于业务逻…

倒计时小工具_送你3个倒数计日的小程序,让你不再遗忘重要事

每天我们忙于工作,忙于生活,在很多重要事情,重要人的生日,以及重要有意义的日子总会在忙碌中被遗忘,那么这该怎么办呢?别紧张,小编为你带来3个倒数计日的小程序,让你不再遗忘重要事情…

Spring声明式事务管理

Spring 的事务管理有两种方式:一种是传统的编程式事务管理,即通过编写代码实现的事务管理;另一种是基于 AOP 技术实现的声明式事务管理。由于在实际开发中,编程式事务管理很少使用,所以我们只对 Spring 的声明式事务管…

无法检查指定的位置是否位于cfs上_打印机知识普及:七大原因导致的打印机无法打印及解决方法...

打印机无法打印的原因有很多,如果我们遇到打印机无法打印应该首先从简单到复杂入手。首先必须排除一些最简单的问题,比如打印机是否正常安装。另外打印机内部是不是已经放置有墨盒以及打印纸等,这些基本问题必须排除,另外还有一个…

Spring基于Annotation实现事务管理

在 Spring 中,除了使用基于 XML 的方式可以实现声明式事务管理以外,还可以通过 Annotation 注解的方式实现声明式事务管理。 使用 Annotation 的方式非常简单,只需要在项目中做两件事,具体如下。 1 在 Spring 容器中注册驱动&…

python扩展,用python扩展列

我试图在python中扩展数据帧的某一列。在r中,我将使用这个函数:在python中,我发现df.pivot_table(),但我刚发现一个错误:pandas.pivot_table(df, values Value, index[Day, Money, Product],columns[Account])^更新结果:数据帧没有更改。它只返回相同的数据文件而不进行扩展。考…

基于matlab的pcm系统仿真_深入理解基于RISC-V ISS Spike的仿真系统:探索Spike,pk和fesrv...

Spike, the RISC-V ISA Simulator, implements a functional model of one or more RISC-V processors.Spike is named after the golden spike used to celebrate the completion of the US transcontinental railway.一些同学初接触RISC-V,总逃脱不了被Rocketchip…

单机安装oracle,单机安装oracle系统

一、安装oracle6.9操作系统1、硬盘划分为30G(以下分区皆强制为主分区)/boot 200Mswap 4G/ 剩余全部空间安装下一步的步骤就不说了勾选图形选项基本系统--》备份客户端,大系统性能,存储工具,安全工具,性能工具,目录客户…

redis timeout设置多少合适_热水器怎么调温度?一般热水器温度设置多少度比较合适?...

对于热水器的温度设置您知道怎么操作吗?一般情况下电热水器设置多少度比较合适呢?今天蜜罐蚁装修网小编给大家介绍下热水器如何调节温度,以及热水器调节温度在什么范围比较合适。下面请看小编以美的电热水器某个型号产品举例图文讲解热水器调…

用swing设计一个打地鼠小游戏_这7个风靡欧美的英语小游戏,学会胜过刷100道题!...

精彩导读小编为大家搜罗了一些在国外家喻户晓的语言类小游戏。好的方法胜过刷上100道题,真正让孩子觉得好玩,教学才会事半功倍!01Would You Rather...最近牛津大学的面试考题惊天地爆出了一题:你想要变成吸血鬼还是想要变成僵尸&a…

oracle数据库9i安装,Oracle 9i数据库服务器的安装和辅助软件安装教程

安装数据库服务器以Oracle 9i数据库服务器软件的安装过程为例,介绍数据库服务器的安装过程。14.3.1 安装数据库服务器系统环境数据库服务器安装之前,一般都需要检测系统安装环境,以避免系统不支持、内存不够、硬盘空间不足等情况发生。下面从…

oracle 触发器 行级,oracle的行级触发器使用

行级触发器:当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值.:NEW 修饰符访问操作完成后列的值:OLD 修饰符访问操作完成前列的值例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被…

司铭宇老师:如何让企业销售培训效果落地

如何让企业销售培训效果落地 在企业销售培训中,我们经常听到一个词,那就是“落地”。所谓的“落地”,简单来说就是将培训中所学到的知识和技能转化为实际的工作行动,从而提高销售业绩。但是,如何才能让销售培训效果真…

linux 宽字符串,C语言中的多字节字符与宽字符

C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位。但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码。C95标准化了两种表示大型字符集的方法&am…

C++函数编译原理和成员函数的实现

C函数的编译 C中的函数在编译时会根据命名空间、类、参数签名等信息进行重新命名,形成新的函数名。这个重命名的过程是通过一个特殊的算法来实现的,称为 名字编码(Name Mangling)。 Name Mangling 是一种可逆的算法,…

linux 运行选择哪个cpu核,判断Linux进程在哪个CPU核运行的方法

问题:有一个Linux进程运行在多核处理器系统上,如何查看该进程运行在哪个CPU上?方法一:ps 命令可以告诉你每个进程/线程目前分配到的(在“PSR”列)CPU ID。ps -o pid,psr,comm -p 运行结果:PID PSR COMM5357 10 prog输…

C++对象数组

对象数组是什么 数组对象就是大批量实例化对象的一种方法,例如:Student stu 实例化对象,如果有好几百个对象应该怎么办?这时候就用到了对象数组,顾名思义,就是吧所有要实例化的对象都放到一个组里面&#…

镜像安装linux选择内核版本,在CentOS和Ubuntu中安装Linux Kernel 4.13.10

Linus Torvalds 在 10 月 17 日星期五正式发布了稳定版 Linux Kernel 4.13.10,这个最新版本发布了新功能,进行了诸多修复和问题改进。下面将向大家介绍在 CentOS 和 Ubuntu 中手动安装、更新 Linux Kernel 4.13.10 的方法,当然,这…

linux设备进入睡眠所需时间,android linux 休眠 深度睡眠 查看 方法 调试【转】

在Android移动设备中,有时按下Power键(未接电源,USB)时,因其它apk程序获取了wake_up锁未释放或程序BUG导致未释放,造成未能进入深度睡眠,从而加大了耗电量,减少了待机时间,参考如下图&#xff0…

linux qt5.9交叉编译,QT5.9移植

1.下载Qt源码Qt源码下载地址:Index of /archive/qt 其他源码和其他安装包都是有的。2.解压源码$ mkdir qt5.9$cd qt5.9将下载文件拷贝到当前目录下面。解压$ xz -d qt-everywhere-opensource-src-5.9.7.t…