Python
图片转字符画

一、实验说明

1. 环境登录

无需密码自动登录,

2. 环境介绍

本实验环境采用带桌面的UbuntuLinux环境,实验中会用到桌面上的程序:

  1. LX终端(LXTerminal):Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令

  2. GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器

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

教程,Python图片转字符堆叠图的更多相关文章

  1. Python 图片转字符画

    Python 图片转字符画 一.课程介绍 1. 课程来源 原创 2. 内容简介 本课程讲述怎样使用 Python 将图片转为字符画 3. 前置课程 Python编程语言 Linux 基础入门(新版) ...

  2. Python 图片转字符画 学习笔记

    Python 图片转字符画 学习笔记 标签(空格分隔): Python 声明:此文章和所有代码是学习笔记,非原创,原文教程地址:https://www.shiyanlou.com/courses/37 ...

  3. [笔记] Python 图片转字符画

    一.介绍 用Python 代码完成图片转字符画 二.python 环境 Python 3.6.6 pillow 5.1.0  Python 图像处理库, 需要另外安装 三.原理 gray = 0.21 ...

  4. Python 图片转字符图

    pip install Image argparse pillow from PIL import Image import argparse #命令行输入参数处理 parser = argparse ...

  5. python图片转字符画(转)

    先上代码: from PIL import Image import argparse #命令行输入参数处理 parser = argparse.ArgumentParser() parser.add ...

  6. Python图片转字符

    前段时间学习pillow写的,可以通过改变font_map改变转换的深度和字符.思路是先转换黑白大小,读取黑白值取范围读font_map转变. from PIL import Image,ImageD ...

  7. Python图片转字符画

    PIL安装很麻烦,推荐下载exe直接安装 PIL官网:http://pythonware.com/products/pil/ 但现在里面下载链接访问不了,我把32位和64位版本上传到博客园以供下载 P ...

  8. python 图片在线转字符画预览

    文章链接:https://mp.weixin.qq.com/s/yiFOmljhyalE8ssAgwo6Jw 关于python图片转字符画,相信大家都不陌生,经常出现在 n个超有趣的python项目中 ...

  9. Python matplotlib图片转化成矢量图并裁剪

    Python目前可以生成的图的格式是:eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 在写论文时候我一般生成png ...

随机推荐

  1. ABP:在多语句事务内不允许使用 CREATE DATABASE 语句

    一.问题 使用ef codefirst开发,无法创建数据库的问题,如下提示 Server Error in '/' Application. 在多语句事务内不允许使用 CREATE DATABASE ...

  2. vue模板的几种写法及变化

    第一种: 2+版本支持,1+版本支持 <script> <template id="aaa"> <h1>我是组件2</h1> < ...

  3. Git分支使用心得

    在去年的大约这个时候,我的领导让我研究一下git的使用方法,方便我们自己的代码管理,因为我们原先使用的是SVN,使用起来没那么方便,所以让我研究研究git的使用.我就简单的研究了两天,用我的IDE(v ...

  4. 70. Climbing Stairs【leetcode】递归,动态规划,java,算法

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  5. macOS Sierra Version 10.12.6 环境下Tomcat的下载与安装以及InterlliJ IDEA 2017.2 环境下配置Tomcat 与创建Web项目

    一.Tomcat的下载与安装 1.官网(http://tomcat.apache.org/)下载Tomcat 9.0 Core:zip包: 2.解压到指定的文件夹即可安装完成: 3.测试是否安装成功 ...

  6. 从FMDB到WCDB、微信团队怎么说?

    WCDB背景 自己初次见到WCDB是微信开发团队公众号在今年五月份推送的一篇文章中(开发者团队的微信号上面图片中有,值得大家关注一下),那时候就说在筹备着WCDB的开源,觉得很是新奇,在两个多月前WC ...

  7. re模块的结果小练习题

    1.匹配标签 import re ret = re.search('<(?P<tag_name>\w+)>\w+</(?P=tag_name)>','<h1& ...

  8. win10下vagrant+centos7 rails虚拟开发机配置流程

    此文写于2017.8.21 在写本文前,笔者已经尝试了多种其他的替代方法,例如wmware虚拟机安装kylin.然而发现总是还有各种问题.经大佬指点安装了virtualbox + vagrant.于是 ...

  9. 关于InnoDB存储引擎text和blob类型的优化

    我们在数据库优化的时候,看到一些表在设计上使用了text或者blob的字段,如果单表的存储空间达到了近上百G或者大几十G,这种情况再去改变和优化就非常难了 一.简介 为了清楚大字段对性能的影响,我们有 ...

  10. 遇到local variable 'e' referenced before assignment这样的问题应该如何解决

    问题:程序报错:local variable 'e' referenced before assignment 解决:遇到这样的问题,说明你在声明变量e之前就已经对其进行了调用,定位到错误的地方,对变 ...