代码改变世界

DAY1 图片转化为字符画

2018-03-01 17:15  每天都在进步  阅读(539)  评论(0)    收藏  举报

思路:

  1. 创建一个不重复的字符列表,灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号
  2. 利用PIL库中的Image模块对图像进行处理,然后直接将每个像素点的灰度值与字符集建立映射。   PIL库的使用见http://blog.csdn.net/column/details/pythonpil.html

操作步骤:

    1. 生成字符串集:
      char_list = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
      length = len(char_list)

       

    2. 定义映射函数:
      def get_char(image_file):
          image_file = image_file.convert("L")#转换为黑白图片,参数"L"表示黑白模式
          char = ''
          for h in range(0,image_file.size[1]):  #size属性表示图片的分辨率,'0'为横向大小,'1'为纵向
              for w in range(0,image_file.size[0]):
                  gray = image_file.getpixel((w,h)) #返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组
                  char = char + char_list[int(((length-1)*gray)/256)]#建立灰度与字符集的映射
              char = char+'\r\n'
          return char

完整代码如下:

 1 from PIL import Image
 2 char_list = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
 3 length = len(char_list)
 4 def get_char(image_file):
 5     image_file = image_file.convert("L")#转换为黑白图片,参数"L"表示黑白模式
 6     char = ''
 7     for h in range(0,image_file.size[1]):  #size属性表示图片的分辨率,'0'为横向大小,'1'为纵向
 8         for w in range(0,image_file.size[0]):
 9             gray = image_file.getpixel((w,h)) #返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组
10             char = char + char_list[int(((length-1)*gray)/256)]#建立灰度与字符集的映射
11         char = char+'\r\n'
12     return char
13 fp = open(u'暴走.jpg','rb')
14 image_file = Image.open(fp)
15 image_file=image_file.resize((int(image_file.size[0]*0.75), int(image_file.size[1]*0.5)))#调整图片大小
16 print (u'Info:',image_file.size[0],' ',image_file.size[1],' ',length)
17 
18 tmp = open('tmp.txt','w')
19 tmp.write(get_char(image_file))
20 tmp.close()

效果如下: