html如何将图片作为网页背景_如何使用 Python 将图片变为字符的模样

我们先来看一下,小帅b原本的头像是这样的:

2f480e52b3e62f70a573e81fe933cc20.png

用 Python 写的脚本转一下,就变成这样了:

9340926304928640edbabfa9b9fa41d3.png

也就是说,将图片中的轮廓,用你喜欢的字符代替,是不是有点装逼了:

64d49cd116118bc4c04c8ea9bf44a8c9.gif

这是如何实现呢?接下来就是: 学习 Python 的正确姿势

9ae0c24eaf2583c4100c18ae34e0c76e.png

我们知道,每张图片都是由一个个像素组成的,而你在手机上之所以可以看到五颜六色的 图片,是因为有红绿蓝三原色,它们可以组合成无数种颜色,而我们常见的显示器用的就是 RGB 的颜色标准,不同的 RGB 值代表不同的颜色强度,这个值在 0 到 255 之间。

eb296d76b988edd875a05d71e9595d66.png

其实我们想要让图片使用字符替换,并不需要那么多颜色,所以我们可以把图片转化为灰度图像,这样它就只剩下强度不同的黑与白了,这时候,我们只需要通过颜色的灰度值去区分就可以得到需要替换字符的地方。也就是说我们可以获取一张图片的所有像素,而每个像素都有它特有的灰度值,从 0----->255 表示从最黑到最白,那么我们只要准备 256 个字符,把字符替换成灰度值,接着再输出就行了。 3fd91e5d2d3a83dab0f02efead19a426.png因为灰度图像只是黑白强度不同,所以我们并不需要细致到每一个具体的数值,可以把 0 ----> 255 拆分一下,比如每 25 个灰度值代表一种强度:0--->25        白      对应字符a25--->50      浅灰     对应字符b 50--->75      灰        对应字符c ...           越来越灰    对应字符d 225--->250   黑        对应字符e 我们可以在这每个区间里定义一个字符,这时候只要判断像素的灰度值,看看这个值在什么区间,对应替换相应的字符就可以了。比如 a 这个字符对应的是  0--->25 的灰度值区间,如果我们获取到图片的某一个像素的灰度值为 24 ,那么就将这个像素替换为a。事就是这么个事,我们还是来用代码体现一下会比较清晰。 0x00 | 定义字符串列表定义一个字符串列表,我们将灰度值以 25 为单位进行拆分,那么这个列表就需要有 11 个字符:

2dc55625a87839077441efaacbd8f237.png

0x01 | 获取图片想要通过命令直接获取图片的路径,可以用 sys 模块中的 argv 属性,从  argv[1] 中可以获取到使用 Python 命令携带的参数:

054f3d602a33d26f2d8cc71bfc989f64.png

0x02 | 图片等比缩放我们可以自己定义一下要输出的字符图片尺寸。通过 Pillow 库打开图片,等比例缩放:

d20a87142b4d563a7b893a14ffdf4748.png

a72352e9e9f797902c9bba2e0420cccb.png

比如我们希望输出的字符图片宽度是 100 ,那么就先获取下原图的宽高,计算下宽高比,然后得出新图的宽高,生成新的图片:

ac9cf5d7f93defc4148f48709f0996c9.png

0x03 | 图片转成灰度将图片转化为灰度很简单,调用 convert 方法就可以了:

c6e73990c310b753868f3caf9dcd9473.png

cef4781a12437d16b9caac273758c9ca.png

0x04 | 获取图片的像素 可以通过 image.getdata 来获取图片的所有像素灰度值:

f85fce0ddbef63ea7a5a9708949b8cd2.png

可以打印看看这些像素值:

3138c53d0955b60957aaed6e01f4197d.png

运行一下是这样子的:

7cbfe879a100a38e55cafb338fe99acf.png

(密集恐惧的不要点看)是的,接下来我们就根据这些值替换字符。 0x05 | 替换字符我们刚说了,将灰度值以 25 为单位区分,所以我们可以通过像素的值除以 25 ,得到的就是我们刚刚定义 chars 列表的 index ,将 index 对应的这些字符拼起来就可以了:

3722834454fcaa422a6519f50ffefac0.png

将刚刚获取的像素替换成字符,打印一下:

c0ad2160af39b0466195c6428e4b5704.png

我们运行下:

cab43ca357335c434d338e43ada19ac8.png

我们刚刚定义的列表是这样的:

2dc55625a87839077441efaacbd8f237.png

而刚刚获取的图片像素值 255 是最多的,所以替换得到的 chars[10] 也就最多,不过为啥现在得到的结果乱七八糟呢? 0x06 | 结构化字符这是因为我们刚刚缩放了图片的宽高,输出的字符应该要对应相应的宽高,所以需要先获取一下刚刚的字符长度,接着循环它,以缩放后的宽作为步长,这样得到的列表中的每个元素都是固定宽度的字符,接着就可以通过 join 将列表转化为字符串,每一行都铺上相应的字符:

659e3e5477cf1920c35920108914add0.png

现在再来运行一波:

38e08cc9d6e2a33b04677d91ed7b6c1c.png

是不是有点内味了,当然,图片的缩放比可以根据图片再调调,比如我们在计算缩放后的高度给它 × 个 0.66 看看:

fea4db028f9a17112d856f38f8d93c7e.png

再运行一下:

3b7ddc3fdeb7ee4af242126c3416c676.png

是不是稍微舒服点了?

ok,以上。

部分代码参考至:

https://github.com/RameshAditya/asciify/blob/master/asciify.py

本篇所涉及的完整代码可在公众号后台发送 2 获取,主要还是给你分享下思路,希望对你有帮助,那么我们下回见,peace!

点击留言

相关

让小姐姐在命令行里面性感跳舞

2020-01-13

ad9961a4f0867b19e4141496ea76c376.png

python 这样 print 才够骚啊 (3)

2019-12-25

555ec363799637fa29f7cd0d3f485e5a.png

python 这样 print 才够骚啊 (2)

2019-12-23

7b1494cd41876f5930dc99f8277240ce.png

Python 这样 print 才够骚啊

2019-09-25

6f1642cbcca11ebce892b08be098e1ee.png

06e001f2328fc6ab7c498007f37da25c.gif

扫一扫

学习 Python 没烦恼

c5b4663b606385a4967b5be4677bfe4f.png

小彩蛋 (横屏才能看到哦!)
........................................
........................................
........................................
........................................
..............66.....66.................
...........66.66.....66.................
...........66.66.6666666666.............
...........66.66.66..66..66.............
...........66.66.66..66..66.............
...........66.66.66..66..66.............
...........66.66.66..66..66.............
.............666.66..66..66.............
.............66..66..666666.............
............666......66.................
...........666.......66.................
........................................
........................................
........................................
........................................
........................................
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值