前言:
字符画:字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色,字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。
如果我们想要手工绘制出字符画,首先要有扎实的美术基础,其次还要花费大量的时间和精力。但是我们可以使用python,只需要几行代码,就能够将一张图片轻而易举地转化为一个字符画。
实例1
效果图:
理论很简单,就是对图片操作,这里需要用到pil的python包,里面有很好用的图像处理功能。
先打开图片,把图像调整大小:
img = image.open(picpath) img = img.resize((picw, pich))
然后读取灰度值,再把灰度值和字符对应起来就行。
from pil import image lstchars = list("$@b%8&wm#*oahkbdpqwmzo0qlacjuyxzczjhdhsdavunxrjft/\|()1{}[]?-_+~<>i!li;:,\"^`'.") def onechars(r, g, b, alpha = 256): global lstchars length = len(lstchars) gray = int(0.2126 * r + 0.7152 * g + 0.722 * b) index =length*gray return lstchars[index] picpath = "c:\users\administrator\desktop\\aaaaa\\aa.png" pich = 40 picw = 80 img = image.open(picpath) img = img.resize((picw, pich)) txt = "" for y in range(pich): for x in range(picw): txt += onechars(img.getpixel((x, y))) txt += '\n' print txt
实例2
下面是源码:
# -*- coding=utf-8 -*- from pil import image img = 'img.jpg' # 设置图片文件 width = 150 # 设置字符画的宽 height = 80 # 设置字符画的高 output = 't.txt' # 设置存放字符画的文本文件 ascii_char = list("$@b%8&wm#*oahkbdpqwmzo0qlcjuyxzcvunxrjft/\|()1{}[]?-_+~<>i!li;:,\"^`'. ") # 设置显示的字符集 # 将256灰度映射到70个字符上 def get_char(r, g, b, alpha=256): # alpha为透明度 # 判断 alpha 值,为0表示全透明 if alpha == 0: return ' ' # 获取字符集的长度,这里为 70 length = len(ascii_char) # 将 rgb 值转为灰度值 gray,灰度值范围为 0-255 gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) # 灰度值范围为 0-255,而字符集只有 70 # 需要进行如下处理才能将灰度值映射到指定的字符上 # 防止当灰度值为255时,输出的第70个字符超出列表索引,所以需要将(255+1) unit = (255.0 + 1) / length # 返回灰度值对应的字符 return ascii_char[int(gray / unit)] if __name__ == '__main__': # 打开并调整图片的宽和高 im = image.open(img) im = im.resize((width, height), image.nearest) # 初始化输出的字符串 txt = "" # 遍历图片中的每一行 for i in range(height): # 遍历该行中的每一列 for j in range(width): # 将 (j,i) 坐标的 rgb 像素转为字符后添加到 txt 字符串 txt += get_char(*im.getpixel((j, i))) # 遍历完一行后需要增加换行符 txt += '\n' # 输出到屏幕 print(txt) with open(output, 'w') as f: f.write(txt)
直接粘贴即可,只需要在文件夹中导入一张图片重命名为img.jpg。运行结果会生成一个名为t.txt的文件。
原图:
生成文件图:
到此这篇关于如何利用python实现图片转化字符画的文章就介绍到这了,更多相关python字符画内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!