您的位置:首页 > 编程语言 > Python开发

python学习之PIL库学习---制作ASCII风格图片

2015-01-12 13:34 573 查看
今天闲来无事在网上发现了一种奇特的图片---ascii图片,如图



放大可以发现,其实这张图完全是由字符按照不同灰度构成的(如图)



这项技术在7-8年前很时髦,于是我准备研究一下

原理:我们可以发现虽然这个图片完全由文字生成,但基本的图案还是很清晰的,原理是人眼通过明暗的不同可以看出图片的大概轮廓

可以简单地把一个文字想象成一个白色的方块上占有一定面积的黑色图案,"@"在这个方块上黑色占的面积显然大于"."中黑色占的面积

就是通过不同字符中黑色所占的面积达小,我们可以模拟出图像的灰度,从而形成图像的轮廓

开写:

这次依旧使用python来写代码,我们需要用到的库只有PIL(python image labpython图像库)

ubuntu中可以直接简单安装

sudo apt-get install python-imaging


</pre><p></p><p>接下来是主体代码</p><p></p><p></p><pre name="code" class="python"># -*- coding: utf-8 -*-
import Image
from PIL import Image,ImageDraw,ImageFont
color_str = '@MNH$OC?7>!:-;.'#这里是代表明暗的字符库

def pic_to_ascii(img):

img_name = img.split('.')
img = Image.open(img).convert('L')#这里一步是使用pil库把图片处理成黑白
pix = img.load()#获取图像上每一个像素
width,height = img.size
pic =[]
for h in xrange(height):
img_wid = []
for w in xrange(width):
img_wid.append(color_str[int(int(pix[w,h])*len(color_str)/255 )-1])#由于灰度图片只有255个色阶,所以这里一步是换算出每个像素点所代表字符库中的字符
pic.append(img_wid)
<span style="white-space:pre">	</span>
pic_new = Image.new('RGB',(len(pic[0])*10,len(pic)*10),(255,255,255))#这里pil库生成一个根据原图长宽×10来换算出的新图(10是每个字符的大小)
draw = ImageDraw.Draw(pic_new)
font = ImageFont.truetype('/home/lee/.local/share/fonts/arial.ttf',10)#这里选一个本地的字体文件

for y in range(len(pic)):
for x in range(len(pic[0])):
draw.text((x*10,y*10),pic[y][x],(255,0,0),font=font)#最关键一步,在每一个位置上写一个字符,形成一张新图

pic_new.save(img_name[0]+"_ascii.jpg",'JPEG')

print "saved!"

def main():
pic_name = raw_input("please input the name of the picture:")
pic_to_ascii(pic_name)

if __name__ == '__main__':
main()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  创意 python