python生成字符画

这个idea来自于实验楼,非常适合练习PIL的像素处理,更重要的是非常有意思。

环境配置

依赖的第三方库就是PIL(Python Image Library),可以直接使用pip安装

pip install pillow

测试安装是否成功

>>> from PIL import Image

原理

原理其实很简单,主要分为三步:

  1. 导入图片,做预处理
  2. 把图片二值化,转化成灰度图,在把灰度映射到字符上,用一个字符表示一个像素,返回一个文本
  3. 把文本写入文件

以下是main函数

def main():
img = loadImage('./a.jpg')
text = convert(img)
store(text)
print "finish!"

导入图片

#打开图片,还可以做预处理如resize
def loadImage(fileName):
img = Image.open(fileName)
return img

把图片转成文本

#核心函数,把image对象转换成文本
def convert(img):
color = "MNHQ$OC?7>!:-;." #自定义字符集
length = len(color)
w,h = img.size
grey = img.convert('L') #转化为灰度图
text = ''
#依次遍历每个像素,把灰度图转化成文本
for x in xrange(h):
for y in xrange(w):
pixel = grey.getpixel((y,x))
if pixel==0:
text += ' '
else:
text += color[(pixel*length)/255-1] #减1是为了防止字符串越界
text += '\n'
return text

写入文件,这里采用HTML形式

#写文件,这里把结果用HTML呈现
def store(text):
head= '''
<html>
<head>
<style type="text/css">
body {font-family:Monospace; font-size:5px;}
</style>
</head>
<body> '''
tail = '</body></html>'
html = head + text.replace('\n','<br>') + tail
#写文件
f = open('out.html','w')
f.write(html)
f.close()

完整代码

#coding=utf-8
from PIL import Image #打开图片,还可以做预处理如resize
def loadImage(fileName):
img = Image.open(fileName)
return img #核心函数,把image对象转换成文本
def convert(img):
color = "MNHQ$OC?7>!:-;." #自定义字符集
length = len(color)
w,h = img.size
grey = img.convert('L') #转化为灰度图
text = ''
#依次遍历每个像素,把灰度图转化成文本
for x in xrange(h):
for y in xrange(w):
pixel = grey.getpixel((y,x))
if pixel==0:
text += ' '
else:
text += color[(pixel*length)/255-1] #减1是为了防止字符串越界
text += '\n'
return text #写文件,这里把结果用HTML呈现
def store(text):
head= '''
<html>
<head>
<style type="text/css">
body {font-family:Monospace; font-size:5px;}
</style>
</head>
<body> '''
tail = '</body></html>'
html = head + text.replace('\n','<br>') + tail
#写文件
f = open('out.html','w')
f.write(html)
f.close() def main():
img = loadImage('./a.jpg')
text = convert(img)
store(text)
print "finish!"
if __name__=="__main__":
main()

运行结果

a.jpg


out.html

效果非常理想,字符图还别有美感呢。

python生成字符画的更多相关文章

  1. Python下字符画(ascii art)生成

    之前在b站上看到有人用C写了个脚本把妹抖龙op转换成字符画的形式输出了,感觉比较好玩在下就用python也写了一遍(主要是因为python比较简单好用).这里就这里就不介绍字符画了,因为能搜到这个的肯 ...

  2. 通过python将图片生成字符画

    基础知识: 1.python基础知识   快速学习链接:https://www.shiyanlou.com/courses/214 2.linux命令行操作   快速学习链接:https://www. ...

  3. python学习 —— 字符画

    代码: import os from PIL import Image WIDTH = int(250) HEIGHT = int(250/2) ascii_char = list('toahkbdp ...

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

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

  5. python学习---50行代码实现图片转字符画2

    from PIL import Image codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<> ...

  6. python小项目(-)图片转字符画

    # -*- coding: utf-8 -*- from PIL import Image codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrj ...

  7. 用函数式的 Swift 实现图片转字符画的功能

    今天整理 Pocket 中待看的文章,看到这篇<Creating ASCII art in functional Swift>,讲解如何用 Swift 将图片转成 ASCII 字符.具体原 ...

  8. Spring boot自定义启动字符画(banner)

    spring boot项目启动时会打印spring boot的ANSI字符画,可以进行自定义. 如何自定义 实现方式非常简单,我们只需要在Spring Boot工程的/src/main/resourc ...

  9. 使用Python生成ASCII字符画

    使用Python生成ASCII字符画 在很多的网站主页中或者程序的注释中会有一些好看的字符注释画.显得很牛逼的样子 例如: 知乎 _____ _____ _____ _____ /\ \ /\ \ / ...

随机推荐

  1. [转] JavaScript 单例模式

    定义 确保一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式使用的场景 比如线程池.全局缓存等.我们所熟知的浏览器的window对象就是一个单例,在JavaScript开发中,对于这种只需要 ...

  2. html5 之 local storage \sessjion storage

    转载: HTMl5的sessionStorage和localStorage html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessi ...

  3. 选择结构switch

    1.选择结构switch switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码.例如,在程序中使用数字1~7来表示星期一到 ...

  4. A - Exposition CodeForces - 6E

    题目链接:https://vjudge.net/contest/202699#problem/A 题意 给一个n个元素的序列,从中挑出最长的子序列,要求子序列中元素差的最大值不超过k.问有几个最长子序 ...

  5. Evaluation map and reflexive space

    For a normed space \(X\), an isometric isomorphism can be defined from \(X\) to its second dual spac ...

  6. [转]安卓手机google商店的账号切换退出方式

    来源:http://blog.csdn.net/bianchengninhao/article/details/42240839 1.设置 2.账户 3.Google 4. 5.点击菜单键 6.最后删 ...

  7. [转]java位运算(1)

    http://blog.csdn.net/xiaochunyong/article/details/7748713 Java提供的位运算符有:左移( << ).右移( >> ) ...

  8. kafka其中一台节点坏掉的迁移或者数据迁移

    kafka版本:适用于目前2.0以下 第一步: 假如有一个topic叫做test,当前topic的详情是这样的: [cdh@cdh1 kafka_2.11-1.0.1]$ bin/kafka-topi ...

  9. quratz线程

    1.线程 在 Quartz 中,有两类线程,Scheduler 调度线程和任务执行线程,其中任务执行线程通常使用一个线程池维护一组线程. 2.调度线程 下面说明两种调度线程: Scheduler 调度 ...

  10. oracle中date数据的转换问题

    (TO_NUMBER(TO_CHAR(FP.KPRQ, 'HH24')) >= 18 kprq >= to_DATE ('2017-01-12 18:00:00','yyyy-MM-dd ...