在常见的RGB(A)模式图片中,利用每个像素点的R,G,B值按照公式转换成灰度值(0~255),然后在自己创建的字符表中找到灰度值对应的字符,添加到一个文本文件中,就实现了图片转字符画(黑白)。

但是此方法不适用于颜色种类丰富的图片,虽然有对应256个灰度值正好存在256个字符,可以完全区分不同的灰度值,但是毕竟一个像素和一个字符 大小相差悬殊,转换后价值不大。

如果要转换一张宽高像素比较大的图片,除了使用ps等修图工具将像素改小,还可以使用pillow库改变图片大小。

这是我利用pillow库函数把图片像素改小后的转换:

其实这是一碗泡面~

因为改小了,图片上的字就失真了,看不清楚

直接贴代码了

/picTostr.py

#!/usr/bin/python
#-*- coding:utf-8 -*-
from PIL import Image
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)
# 获取参数数据,使用parse_args()解析 解析对象
args = parser.parse_args()

其中o,width,height为非必须参数,参数数据类型默认为字符串,除非设置type属性,default为参数默认数据。

不加’-‘表示必须参数,同时也是参数名称,此时名称不可以通过添加’- -‘修改;

加’-‘表示可选参数,此时参数名称为当前,如果后面有加’- -‘的,则参数名称改为’- -‘紧接的字符串,此时’-o’和’–output’均可作为输入时的参数声明;

必须参数必须按照add_argument()的顺序添加参数值(中间可插入非必须参数),非必须参数可以打乱顺序,但需要参数名称和参数值一一对应

以上eg:python picTostr.py –output picTostr_output.txt -height 50 test.jpg -width 100(打乱顺序)

class character():def __init__(self):self.IMG = args.fileself.WIDTH = args.widthself.HEIGHT = args.heightself.OUTPUT = args.output# 不同字符代表不同色块,字符最好不要重复self.ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")self.txt = ''# 将256灰度映射到70个字符上# 图片格式为RGB的*im.getpixel((j,i)后会得到三个参数r(red),g(green),b(blue);RGBA得到四个参数r,g,b,alpha(透明度,0表示完全透明)# im.getpixel((j,i))得到一个由r, g, b, alpha(如果有的话)构成的元祖,加上*号即表示拆分元祖分别赋值引用def get_char(self, r, g, b, alpha = 256):# 如果是透明的,则输出空格if alpha == 0:return ' 'length = len(self.ascii_char)# r,g,b转换为灰度值,白色是255,黑色是0gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)# 单元字符的灰度值大小unit = (256.0 + 1)/length# 字符从小到大表示灰度值,已知灰度值大小,一个字符表示的灰度值大小,求该灰度值由第几个字符表示,ascii_char[i]return self.ascii_char[int(gray/unit)]def convert(self):im = Image.open(self.IMG)# im.resize(size,filter)# 变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一# 如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST,速度快# ANTIALIAS 抗锯齿,质量最高;BICUBIC 三次样条插;BILINEAR 线性插值法im = im.resize((self.WIDTH,self.HEIGHT), Image.NEAREST)for i in range(self.HEIGHT):for j in range(self.WIDTH):self.txt += self.get_char(*im.getpixel((j,i)))self.txt += '\n'def save(self):if self.OUTPUT:with open(self.OUTPUT,'w') as f:f.write(self.txt)else:with open("output.txt",'w') as f:f.write(self.txt)def start(self):self.convert();self.save();if __name__ == '__main__':c = character()c.start()

以前一直以为一些贴吧大神的小尾巴上字符画是手打出来了,看来是我太天真了。

关于pillow的使用,推荐看看这位大神的博客:

Python图像处理库PIL的基本概念介绍
Python图像处理库PIL的基本模块介绍
Python图像处理库PIL的Image模块介绍(一)
Python图像处理库PIL的Image模块介绍(二)
…………

讲的非常全,学完可以不用PS修图啦~

【003】Python实现图片转字符画(pillow 库的使用)相关推荐

  1. 怎样用python生成中文字符画_如何利用Python实现图片转字符画详解

    本篇文章主要介绍了Python实现图片转字符画的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 字符画真的很有意思,将图片中的像素用字符代替,就生成了字符画. 但是像 ...

  2. 简单使用python将图片转换为字符画

    将图片转换为字符码的形式相信大家都有见过. 记得小编以前看到这些的时候是极其羡慕的,也很渴望能够实现这项功能. 然后将一副画转换为这样的字符画,发给周围的朋友炫耀. NH HN–: !;;– –;;; ...

  3. python动态图片转字符画_GIF动态图,视频?都能用Python转换成字符画图像

    字符画是一种由字母.标点或其他字符组成的图画,它产生于互联网时代,在聊天软件中使用较多,本文我们看一下如何将自己喜欢的图片转成字符画. 静态图片 首先,我们来演示将静态图片转为字符画,功能实现主要用到 ...

  4. Python 实现 图片转 字符画,静态图、GIF 都能转

    源码在python学习交流q群:733089476 获取 字符画是一种由字母.标点或其他字符组成的图画,它产生于互联网时代,在聊天软件中使用较多,本文我们看一下如何将自己喜欢的图片转成字符画. 静态图 ...

  5. python实现图片转字符画_Python实现图片转字符画的示例代码

    初学Python,在网上看到Python图片转字符画的教程,我也来尝试下. 首先我们要用到Python的PIL库的Image模块,PIL(Python Imaging Library)库是Python ...

  6. python动态图片转字符画_Python实现图片转字符画

    原博文 2018-05-17 13:18 − 一.任务描述   西普工程师想了解Python的命令行,以达到更好的对Python更深入的认知,打算利用argparse库实现图片转字符画的实验,结合Py ...

  7. so easy,用 Python 实现图片转字符画

    相信大家在网上经常看到有人秀出各种各样的字符画,对于这个五彩斑斓的世界来说,我们日常看到的都是一些高清的彩色的图片,偶尔来个粗糙的黑白的字符画,还是比较解乏的.喜欢记得收藏.关注.点赞. 注:文末提供 ...

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

    关于python图片转字符画,相信大家都不陌生,经常出现在 n个超有趣的python项目中. 今天我也来实践这个有趣的项目,更进一步的是把这个功能做成一个在线的网站,直接上传图片生成字符画,在线预览可 ...

  9. 用 Python 实现图片转字符画,so easy!

    作者 | 派森酱 来源 | Python技术 相信大家在网上经常看到有人秀出各种各样的字符画,对于这个五彩斑斓的世界来说,我们日常看到的都是一些高清的彩色的图片,偶尔来个粗糙的黑白的字符画,还是比较解 ...

最新文章

  1. matlab有没有查找替换,matlab-字符查寻与替换
  2. 决策树模型组合之随机森林与GBDT
  3. Maven中使用tomcat:run出现错误org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
  4. mysql数据库引擎InnoDB和MyISAM的区别
  5. linux adb工具_这是一个可以显示Linux命令的工具
  6. 你不了解PHP的10件事情
  7. 20151208_使用windows2012配置weblogic节点管理器
  8. 论文浅尝 - WWW2020 | 通过对抗学习从用户—项目交互数据中挖掘隐含的实体偏好来用于知识图谱补全任务...
  9. 常用的redis命令
  10. minigui大号字体的实现,即ttf库的使用【转】
  11. C++ zip压缩库使用
  12. 有源带阻和无源带阻的区别_发明有源低音炮的 Ken Kreisel重新定义了低音炮:把玩DXD300A/B...
  13. python找出列表间隐含的关联关系以及重复模式
  14. html的form表单详解
  15. Android之notification通知无法点击打开APP问题解决
  16. C语言Matrix编程题——[Recursion]D. Liang 8.2 Fibonacci number
  17. 重标极差(R/S)分析法计算Hurst指数(Python)
  18. 计算机毕业设计Java优乐帮育儿系统(系统+程序+mysql数据库+Lw文档)
  19. 2019年CVTE实习心得
  20. 1111111111111111111111111111

热门文章

  1. UI自动化基础 - selenium快速入门教学
  2. 晗月酒店集团谢元平:机器人服务生系统助力晗月H酒店智能化发展
  3. 服务器到底是什么呢?
  4. 卖个艺,给大家来段相声
  5. 03-STM32+Air724UG远程升级篇OTA(自建物联网平台)-STM32+Air724UG实现利用http/https远程更新STM32程序(TCP指令,单片机程序检查更新)
  6. 【程序员要不要报班】难以抉择 ing
  7. 摄影构图的核心技巧 - 不是三分法,也不是做减法
  8. HashMap 和 HashTable 哪不同 ?
  9. 2018上半年各品牌旗舰手机大盘点,你最喜欢哪款呢?
  10. 刚买的沙发床,推荐一下