网站开发与设计教程,传统网站与营销型网站,ps网站设计与制作,生鲜网站怎么做今天和大家分享一个简单又好玩的Python项目–“图片转字符画”。废话不多说#xff0c;先上一个效果图迷惑一下众生。没错的#xff0c;图片转字符画就是将我们平常所看到的的图片根据像素RGB值和灰度值传化成一个个字符串的过程。嗯…听起来有些费脑子喔。没关系#xff0c…今天和大家分享一个简单又好玩的Python项目–“图片转字符画”。废话不多说先上一个效果图迷惑一下众生。没错的图片转字符画就是将我们平常所看到的的图片根据像素RGB值和灰度值传化成一个个字符串的过程。嗯…听起来有些费脑子喔。没关系且听小五为小伙伴一一分解。像素RGB值什么是像素RGB值其实就像我们平常所看到的所有图片无论是彩色照还是黑白照其实它们都是有色彩的更加神奇的是我们肉眼所看到的所有色彩几乎都是由红Red、绿Green、蓝Blue经过不同深度的调色后得到的。而RGB色彩模式就是是工业界的一种颜色标准是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的。所以RGB即是代表红、绿、蓝三个通道的颜色这个标准几乎包括了人类视力所能感知的所有颜色是目前运用最广的颜色系统之一。所以也可以说我们所看到的所有具有色彩的图片都是由这三种颜色调出来的。而对于字符画顾名思义是一系列字符的组合我们可以把字符看作是比较大块的像素一个字符能表现一种颜色。就像我们刚才所看到的那张图片转成字符画之后画中包含着各种不同层次的字符所以字符的种类越多可以表现的颜色也越多图片也会更有层次感。那么小伙伴们可能就会问了我们是要转换一张彩色的图片这么多的颜色要怎么对应到只有一种颜色而且还包括那么多字符的的字符画上去哈哈不知道了吧这里就要介绍灰度值的概念了。来来来科普一下灰度值计算灰度值指黑白图像中点的颜色深度范围一般从0到255白色为255黑色为0故黑白图片也称灰度图像。所以我们可以使用灰度值公式将像素的 RGB 值映射到灰度值也就是下面这个公式注意这个公式是简化过的真正的计算公式会复杂些灰度值计算公式gray 0.2126 * r 0.7152 * g 0.0722 * b这样就好办了我们可以创建一个不重复的字符列表然后用每一个字符表示一种颜色灰度值小暗的用列表开头的符号表示灰度值大亮的用列表末尾的符号表示。注意重点来了敲黑板我们知道。单从黑色到白色颜色深度的范围就是0-255也就是说这一共有256个不同深浅的颜色那我们如果想要将每一种颜色以不同的字符表示出来那岂不是需要256个不同的字符嘛哈哈我觉得也是去找256个不同的字符写的你的程序里面组成一个字符串想想都刺激但是你会去这么做嘛我想不会吧所以我们只需要想一种办法让颜色深度相近的灰度值用不同的符号表示即可所以我们可以定义一个存放不同字符的字符串用来表示不同的色彩的字符。在这里定义的这个字符串的长度是70。定义代表灰度的字符ascii_char list($B%8WM#*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个字符超出列表索引所以需要将(2551) unit (255.0 1)/length # 返回灰度值对应的字符 return ascii_char[int(gray/unit)]当我们写好像素映射字符串的函数方法之后我们就可以对不同的像素获取到不同的字符表示了。图片导入及尺寸设置那么接下来就是我们应该如何获取图片上某一点处的像素了。这个时候我们需要调用pillow库这个库的作用就是对图片进行基本的处理。在这里我们需要使用的是pillow库下的Image类使用Image下的resize方法我们可以对图片进行缩放并设置输出的图片质量。以下面这张图片为例进行图片缩放和输出质量设置IMG t01b2a945701805d7f1.jpg #设置图片文件WIDTH 150 #设置字符画的宽HEIGHT 80 #设置字符画的高im Image.open(IMG)im im.resize((WIDTH,HEIGHT), Image.NEAREST)遍历图片获取字符之后可以调用Image.getpixel()方法给其传入坐标参数就可以返回该坐标处的像素值值得注意的地方是如果这个坐标处的像素是具有透明属性的。那么还会返回alpha透明度参数这就是为什么我们在映射字符串函数方法的参数中传入透明度参数并进行判断的原因。将 (j,i) 坐标的 RGB 像素转为字符后添加到 txt 字符串txt get_char(*im.getpixel((j,i)))现在我们要做的就是对该尺寸的图片进行横向和纵向的坐标遍历获取到每一个坐标点处映射的字符并将其在存储在我们设定的存放图片字符串的列表中即可。遍历图片中的每一行for i in range(HEIGHT): # 遍历该行中的每一列 for j in range(WIDTH): # 将 (j,i) 坐标的 RGB 像素转为字符后添加到 txt 字符串 txt get_char(*im.getpixel((j,i))) # 遍历完一行后需要增加换行符 txt n字符画输出和导入文件最后将该字符列表在屏幕输出或者存放到文本文件中为了可以更好的看到字符画的效果在这里大灰狼建议将该字符列表存放到一个文本文件中。导入文件OUTPUT output5.txt #设置存放字符画的文本文件#保存到文本文件with open(OUTPUT,w) as f: f.write(txt)将图片转字符画处理后保存在文本文件中我们可以在文本文件中找到被字符化后的照片了。好了到这里图片转字符画的过程就基本结束了。除去注释最后不到25行使用的小伙伴只需要将程序最上面的图片路径修改成自己的图片即可