30 行代码带你用 Python 在命令行查看图片

来源:Python 技术「ID: pythonall」

每次看黑客类的电影时都惊叹于黑客的技术之高超,黑客的手在键盘上飞快的敲击,屏幕上各种字符狂闪不止,接着系统就被黑掉了。

我们都知道黑客在命令行发送的各种命令都是英文字母或者数字,那么我们是否可以直接在命令行查看图片呢?

答案是可以的,今天派森酱就带你在终端查看图片。

先来看看我们最终实现的效果。

安装

我们今天要用到 pillow 库,直接使用 pip 安装即可。

$ pip install pillow

使用之前需要先将相应模块引入我们的程序。

from PIL import Imagefrom PIL import ImageFilter

Hello World

PIL(Python Imaging Library)是 Python 平台上一个非常好用的图像处理库,功能强大且 API 简单易用,但仅支持到 Python 2.7,所以有人就在 PIL 的基础上创建了新的版本 pillow,可以支持到 Python 3.x。

来看看模糊效果,只需三四行代码。

im = Image.open('/tmp/qq.jpg')im2 = im.filter(ImageFilter.BLUR) # 应用模糊滤镜:im2.save('/tmp/qq_2.jpg', 'jpeg')

图像缩放,几行代码轻松搞定。

im = Image.open('/tmp/qq.jpg')w, h = im.sizeim.thumbnail((w // 2, h // 2)) # 缩放到 50%im.save('/tmp/qq_thumbnail.jpg', 'jpeg')

字符画

众所周知,终端只可以显示字符,那如果可以把图片转化为字符画,岂不是可以在终端正常显示了,事实上还真可以这么做。其原理就是将图片不同位置的像素点用不同的字符来代替,从而将由像素组成的图片转变成由字符组成的字符画。

但是像素是有颜色的,我们如何将不同颜色的像素编码为对应的字符呢?

这就要涉及到灰度图的概念了。

灰度图,又称灰阶图,把白色与黑色之间按对数关系分为若干等级,称为灰度,共分为 256 阶,0 到 255,0 为黑色,255 为白。用灰度表示的图像称作灰度图。

事实上任何颜色都有红、绿、蓝三原色组成,假如某个像素点的颜色为 RGB(R,G,B),那么,我们可以通过固定公式将其转换为指定灰度即可。

GRAY = 0.2126 * R + 0.7152 * G + 0.0722 * B

拿到像素点的灰度值之后,我们将其对应到指定字符即可,为了最大限度的还原原图像,灰度值较高的像素点我们使用视觉上较深的字符表示(如$),灰度值较低的像素点我们使用视觉上较浅的字符(如:0)表示。

所以,字符的种类与数量越多,能表现的颜色也就越多,字符画的层次感也就会更好。最理想情况是将灰度值和字符一一对应,然而事实上字符数量是远远少于灰度值值域的,所以就会有多个灰度值对应到同一个字符上的情况。

比如我们只用 0 到 9 十个阿拉伯数字来作为我们的字符集,那么一个字符对应的灰度值区间大小就是 25.6(区间大小 = 256 / 字符集长度)。

灰度值区间和字符对应关系:

[0, 25.6) -- 0[25.6, 51.2) -- 1[51.2, 76.8) -- 2...[204.8, 230.4) -- 8[230.4, 256) -- 9

RGB 转换字符

有了以上的理论基础,我们将 RGB 转换为字符的函数定义如下:

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")def get_char_by_rgb(r, g, b): length = len(ascii_char) gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) unit = 256.0 / length return ascii_char[int(gray / unit)]

处理图像

完成了上面的转换函数后,我们就要开始对处理图像了。

首先我们需要调整下图片的大小,以免图片太大或者太小,然后我们遍历图片的每个像素点获取到 RGB 值,然后根据函数 get_char_by_rgb(r, g, b) 获取到对应的字符,最后将所有的字符拼拼接起来输出到终端即可。

注意,我们通过函数 getpixel(x,y) 获取坐标 (x,y) 的像素的 RGB 值,该函数的返回值为一个元组,比如 (1,2,3) 或者 (1,2,3,0) 最后一位的 0 是 alpha 值。alpha 的值为 0 是表示该位置空白。

所以,我们需要修改下 get_char_by_rgb(r, g, b) 函数,添加 alpha 参数。

def get_char_by_rgb(r, g, b, alpha = 256): if alpha == 0: return ' ' length = len(ascii_char) gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) unit = 256.0 / length return ascii_char[int(gray / unit)]

遍历图片获取像素点,然后转换为相应的字符。

def process_image(image_path, file_path='out.txt'): img = Image.open(image_path) img = img.resize((WIDTH, HEIGHT)) width, height = img.size txt = "" for x in range(height): for y in range(width): txt += get_char_by_rgb(*img.getpixel((y, x))) txt += '\n'
with open(file_path, 'w') as f: f.write(txt) print(txt)

最后编写入口函数,就大功告成啦。

if __name__ == '__main__': image_path, file_path = '/tmp/qq.jpg', '/tmp/qq.txt' process_image(image_path, file_path)

至此,我们完成了从原始图像到字符画的转换。

总结

今天我们实现了将图片转换字符画,以便在终端查看图片,可能在不同的终端会显示不同的效果,大家可酌情调整宽高比例。

(0)

相关推荐

  • 用Python进行图像模糊处理和特征提取

    原文链接:http://tecdat.cn/?p=9015 在本文中,我将带您了解图像处理的一些基本功能.特征提取.但是这里我们需要更深入的数据清理.但是数据清理是在数据集,表格,文本等上完成的.如何 ...

  • 如何在Windows系统上安装Python?

    现在用Python的人越来越多,很多学习使用Python的人并不是专业的程序员,而是希望利用Python这个工具去提升自己的工作效率,比如数据分析师.数据运营.风控人员.财务人员等职业都对Python ...

  • PS颜色调整教程,色彩调整“去色”深度分析

    去色:是指将图片的彩色去掉,使用黑.白.灰三种颜色来表现图像,使之成为无彩色图像, 去色原理:PS软件通过一种默认的算法,将彩色图像运算转化成灰度图像,即只用黑.白.灰来表达原来的图像. 原 图 去色 ...

  • 一段蛋疼的代码:超不清视频播放器

    在控制台里播放视频,用字符来表示画面 不过我觉得它至少可以有三个作用:1.用来练习视频和图像处理的编程开发:2.在没有图形界面的服务器上播放视频(虽然效果不咋地):3.作为一种独特的艺术风格化处理 程 ...

  • Python:图片转字符画(~情人节神器~)

    字符画真的很有意思,将图片中的像素用字符代替,就生成了字符画. 但是像素是有颜色深浅的,我们如何将带有不同颜色的像素编码为对应的字符呢? 转化方法: 将彩色图片转化为灰度图 根据颜色深浅的RGB值(值 ...

  • 3段极简代码带你入门Python科学计算库SciPy

    大数据DT 提供大数据.AI等领域干货学习资源的「宝藏号」,跟50万技术人共同成长,一起玩转大数据.Python.数据分析.数据科学.人工智能!还会有各种好玩又奇葩的数据解读,边学习边吃瓜! 510篇 ...

  • python你TM太皮了——区区30行代码就能记录键盘的一举一动

    目录 先看看效果 一.公共WiFi 公用电脑什么的 二.键盘记录器 三.python代码实现 1.安装pynput模块 2.脚本完整代码 3.启动脚本 4.登录126邮箱 抓取用户信息 四.安全提示 ...

  • 实战!Python 30 行代码画各种 3D 图形

    来源:Python 技术「ID: pythonall」 在之前的文章有讲解过 Matplotlib 的用法,可能有的小伙伴们已经略有忘记,如果有不熟悉的读者朋友们请回顾Matplotlib学习进阶 , ...

  • 5行代码搞定14种常见图的python可视化库,还自带16种优美主题,真是太喜欢了

    来自:python分析数据之禅 有时候我们做数据可视化并不需要特别复杂的功能,仅仅是想把简单的数据用图形展示出来 今天就给大家介绍一种非常适合新手的python可视化库--pygal pygal比较小 ...

  • 女神相册密码忘记了,我只用Python写了20行代码~~~

    ​目录 一.事情是这样的 二.首先回顾一下女神的操作流程 三.需要密码打开相册 四.python脚本化处理 1.基本思路 2.解压命令 3.解压命令参数分析 4.整理7z解压命令 5.关门!上pyth ...

  • 30行代码实现朋友圈自动点赞

    首先祝大家新年快乐,过年了,允许我水一篇博客.不知道大家都回老家了没,不过我是没有回去,晚上吃完年夜饭看到很多人发朋友圈,为了增进和大家的友谊,于是就想着给大家点个赞,无奈内容太多了,就搞个自动化脚本 ...

  • 【大开眼界】30行代码,让27吨发电机原地爆炸

    [高度重视]电厂发电机氢爆炸事故及预防!!! 只需要30行代码 (约140KB的文件),就能让20吨的发电机原地爆炸? 这一幕确实发生在了美国爱达荷州的测试场地上. 黑客模拟者将大约30行代码推进保护 ...

  • 用Python自动清理电脑内重复文件,只要10行代码就够了

    给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除 主要涉及的知识点有: os模块综合应用 glob模块综合应用 利用filecmp模块比较两个文件 步骤分析 该程序实现的 ...

  • Python提取 “Excel文本框” 内容,这个需求头一次见,1000个表,10行代码!

    前天 本文介绍 说实话,这个需求头一次碰到,我相信对于大多数朋友来说,也是头一次碰到."提取excel文本框中的内容",对,你没有听错!我也不知道你碰到过没有,但是这确实是一位朋友 ...