更多python相关的实战小项目以及学习资源,可关注微信公众号:noobcoders ,定期分享python学习笔记以及实战小项目,源码分析,
微信公众号: noobcoders
本次小项目所使用的开发环境是Pycharm, python解释器版本为python2.7, 因为这个小项目需要对图片进行处理,所以在进行演练之前还需要安装针对python2.7版本的PIL图形处理库,它是支持Python的第三方库,安装方法百度即可。
一、导入Image模块
在成功安装完PIL图形处理库后,在代码最开始的部分,我们要做的就是导入Image模块,才能使用Image相关方法
from PIL import Image
二、创建字符串库
我们需要自己创建一个用于转换的字符串库,这个字符串库是自己可以随机定义的
# 定义一个字符串库
charlib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''
三、图片与字符串的映射关系
要想实现图片与字符画之间的转换,我们需要知道所要转换的图片与我们所创建的字符串库之间的映射关系。这里以彩色图片为例,它是RGB模式的,所以我们需要把彩色图片转变为灰度模式,才能方便我们找到映射关系,简单说就是把图片中的每一个像素点都在字符串库中找到一个对应的字符来表示,这个映射关系为
charlib[int((gray * (num))/256)]
四、实现整幅图片的扫描转换
下面我们就需要知道如何将图片转变为灰度模式以及如何得到每个像素点的灰度值。在这个项目中是利用Image模块中的convert方法,将图片转变为“L”模式,即灰度模式,这样整幅图片处理成灰度图片,然后再通过getpixel方法就可以得到每个像素点的灰度值,通过遍历行和列实现对整幅图片的转换
def picture_transform(image_file):
image_file = image_file.convert("L") # 将图片转变为“L”模式,即灰度模式
get_char = ""
"""通过遍历行和列来获取每个像素点的灰度值"""
for row in range(0, image_file.size[1]):
for line in range(0, image_file.size[0]):
gray = image_file.getpixel((line, row))
get_char = get_char + charlib[int((gray * (num))/256)] #所获取的灰度值与charlib的映射关系
get_char += "\r\n"
return get_char
总 结
通过这个小项目的练习:
1、对PIL图形处理库有了基本的认识和理解
2、能够基本掌握Image模块的一些使用方法
3、对python的一些语法,编程风格有了进一步了解
完整参考代码如下:
# _*_ coding:utf-8 _*_
from PIL import Image
# 定义一个字符串库
charlib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''
num = len(charlib)
def picture_transform(image_file):
image_file = image_file.convert("L") # 将图片转变为“L”模式,即灰度模式
get_char = ""
"""通过遍历来获取每个像素点的灰度值"""
for row in range(0, image_file.size[1]):
for line in range(0, image_file.size[0]):
gray = image_file.getpixel((line, row))
get_char = get_char + charlib[int((gray * (num))/256)] #所获取的灰度值与charlib的映射关系
get_char += "\r\n"
return get_char
picture = open("c:\\Users\\yason\\Desktop\\timg.jpg", "rb") # 以二进制形式获取图片
image_file = Image.open(picture)
image_file = image_file.resize((int(image_file.size[0]*0.6), int(image_file.size[1]*0.3)))
picture_char = open("picture_char.txt", "w") # 创建一个txt文件用来保存转换后的字符画内容
result = picture_transform(image_file)
picture_char.write(result)
picture_char.close()