教程,Python图片转字符堆叠图
2. 环境介绍
本实验环境采用带桌面的UbuntuLinux环境,实验中会用到桌面上的程序:
3. 环境使用
使用GVim编辑器输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操作。
完成实验后可以点击桌面上方的“实验截图”保存并分享实验结果到微博,向好友展示自己的学习进度。实验楼提供后台系统截图,可以真实有效证明您已经完成了实验。
实验记录页面可以在“我的主页”中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。
二、实验内容
安装pillow(PIL)库:
$ sudo apt-getinstall python-dev
$ sudo apt-getinstall libtiff5-dev libjpeg8-dev zlib1g-dev \
libfreetype6-devliblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
$ sudo pip installpillow
今天我们要做的是图片转字符画!
别慌!这是手工做的,我们这个做不了那么好。
我们做的是这一类字符画!
才几行代码,哪可能做成这种效果。
别急别急,这里只负责讲解原理与生成字符,至于显示效果,那还要看你显示用的媒介怎么样了,像是字符是不是等宽啦,行高和行宽是不是相等啦,屏幕够不够大,够不够亮,够不够有型都可能是影响观赏效果的因素呢。
开始码代码
首先获取实验用图片
wgethttp://labfile.oss.aliyuncs.com/courses/370/ascii_dora.png
创建ascii.py 文件进行编辑
$ vi ascii.py
导入必要的库
from PIL importImage
import argparse
一张图片从图像到字符不是一蹴而就的,需要经过很多步骤,光看着可能没什么头绪,先从成品上着手,成品是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色(暂且这么理解吧),字符的种类越多,可以表现的颜色也越多,图片也会更有层次感,下面是我们选择的字符集。
ascii_char =list("$@B%8 WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~ i!lI;:,\"^`.")
没有自己用手去数吧?告诉你,一共有70 个字符,当然也不是字符越多越好,具体还得看选择的图片,自己反复尝试效果。
问题来了,我们是要转换一张彩色的图片,这么这么多的颜色,要怎么对应到字符上去?这里就要介绍灰度值的概念了。
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
这样就好办了,灰度值大的用列表开头的符号,灰度值小的用列表末尾的符号。
灰度值公式
灰度值= 0.2126 * r + 0.7152 * g + 0.0722 * b
先完成RGB值转字符的函数:
ascii_char =list("$@B%8 WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~ i!lI;:,\"^`.")
defget_char(r,b,g,alpha = 256):
if alpha == 0:
return
length =len(ascii_char)
gray =int(0.2126 * r + 0.7152 * g + 0.0722 * b)
unit = (256.0 +1)/length
returnascii_char[int(gray/unit)]
完整参考代码:
from PIL importImage
import argparse
#命令行输入参数处理
parser =argparse.ArgumentParser()
parser.add_argument(file) #输入文件
parser.add_argument(-o,--output) #输出文件
parser.add_argument(--width,type = int, default = 80) #输出字符画宽
parser.add_argument(--height,type = int, default = 80) #输出字符画高
#获取参数
args =parser.parse_args()
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
ascii_char =list("$@B%8 WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~ i!lI;:,\"^`.")
# 将256灰度映射到70个字符上
defget_char(r,b,g,alpha = 256):
if alpha == 0:
return
length =len(ascii_char)
gray =int(0.2126 * r + 0.7152 * g + 0.0722 * b)
unit = (256.0 +1)/length
returnascii_char[int(gray/unit)]
if __name__ ==__main__:
im =Image.open(IMG)
im =im.resize((WIDTH,HEIGHT), Image.NEAREST)
txt = ""
for i inrange(HEIGHT):
for j inrange(WIDTH):
txt +=get_char(*im.getpixel((j,i)))
txt += \n
print txt
#字符画输出到文件
if OUTPUT:
withopen(OUTPUT,w) as f:
f.write(txt)
else:
withopen("output.txt",w) as f:
f.write(txt)
关键步骤除了那一步就没有了(摊手)
argparse是一个管理命令行参数输入的小工具
运行代码查看效果吧
$ python ascii.py imgfile
LeetCode 第 3 题:无重复字符的最长子串(Python 代码) 这是一道没有多少知识点的题目,就是用滑动窗口的方式来写,算是一道挺简单的题目,但是想了我很久。我的方法和官方的题解是差不多的,但是写完之后看官方题解就感觉很好理解。
相关文章
- python统计大小写字符出现的个数
- Python 标准库 functools 模块详解
- python删除、替换字符串某字符后的字符串(删除字符串、替换字符串、strip、split、rstrip、lstrip、replace)
- python之进程和线程的对比
- python中enum枚举类用法详解
- Python-OpenCV的函数imread()的图片名称参数是不能包含中文-汉字字符的
- 132 python高级 - 正则表达式(表示字符)
- 什么有那么多人选择Python,真的有那么好吗?
- 机器人系统设计与制作:Python语言实现2.2 机器人的传动装置
- python做中学(三)条件编译的用法
- 字符矩阵中查找单词-python
- 《Python Cookbook(第2版)中文版》——1.8 检查字符串中是否包含某字符集合中的字符
- 《Python Cookbook(第2版)中文版》——1.10 过滤字符串中不属于指定集合的字符
- python 常规字符匹配
- python统计字符串字符出现次数
- python 代码库之遍历ttf字库编码和字符(含demo)
- (数据科学学习手札137)orjson:Python中最好用的json库
- python—模拟生成双色球号
- python爬虫 requests.get()返回值与html网页不一致
- python 列表,字符中不常用但重要的知识小试验(1)
- python第一课——关于python的一些概念
- 【python养成】:案例(判断素数、统计字符串中的大写字母、小写字母、数字、其他字符的个数、整数之和、模拟内置函数)
- 学习笔记(36):Python网络编程&并发编程-IO模型介绍
- python过滤非法字符
- 统计字符串中每个字符出现的次数(Python)
- Python写实用小工具-实现图片转字符画
- [Python] 捕获异常