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. Java标识符的命名规则

    Java语言中,为各种变量.方法和类等起的名字称为标识符Java标识符的命名规则:应以字母.下划线.美元符开头后跟字母.下划线.美元符或数字Java标识符大小写敏感,长度无限制 1.java中能用作标 ...

  2. 【python密码学编程】6.凯撒加密法

    凯撒加密法的迷药是0~25的整数 # _*_ coding:utf-8 _*_ #Caeser Ciper import pyperclip messgae = 'this is my secret ...

  3. RobotFramework自动化测试框架-移动手机自动化测试AppiumLibrary介绍

    在使用AppiumLibrary库时,需要预先安装好Appium自动化工具,Appium官网地址为:http://appium.io/ Appium的GitHub地址为:https://github. ...

  4. Angular 小试牛刀[1]:Getting Started

    首先,Angular2 与 Angular1.x 版本没有多大关系,甚至可以说是两个完全不一样的框架,故 Angular 指的是 Angular2 及以上的版本.而 Angular 与 TypeScr ...

  5. MFC加载PNG图片并实现双缓冲

    因为PNG包含Alpha通道,所以不同于BITMAP,在MFC中使用CImage类对其进行处理,通常使用load和draw成员函数. 所以标题的论述可以进一步解释为,使用CImage实现双缓冲. 通常 ...

  6. 为什么新生代内存需要有两个Survivor区

    转载自:http://blog.csdn.net/antony9118/article/details/51425581 在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区? ...

  7. jQuery选择器使用习惯

    http://www.cnblogs.com/fredlau/archive/2009/03/19/1416327.html

  8. Vue.js 入门

    背景 为了学习spring,准备写一个通讯录demo,实现增删改查功能. 前端页面同事推荐用vue.js,因为简单快速,当然前提是基于你对前端的html,css,js有一定的了解 资料 vue.js ...

  9. vc++6.0修改字体

    近期在使用vc++6.0写C程序 问题:vc++自带的字体不太好看 解决办法:修改注册表 1. win+r 运行 regedit 调出注册表编辑器 进入到目录 HKEY_CURRENT_USER\SO ...

  10. Wo Wei Shen Me Hui Zai cnblogs Xie Bo Ke

    我为什么会在cnblogs上写博客.. CSDN上我上传过代码被很多网友下载过.CSDN我申请过博客.也写过几篇博客. 开源中国 我上传过代码.代码也被网友下载过.OSChina我申请过博客.也写过几 ...