python也可以边玩边学,试试做个字符画看看

好久没写文章了,今天朋友写了个简单的脚本发给我,觉得很好,经朋友同意,发来让大家看看,学习就是这样,并不是一味的学,要想办法找到它本身的乐趣,才能让我们在学习的道路上走的顺利一些。

话不多说,进入正题。

这次要用到的库是

os(打开文件)

imageio库(图片io操作的一个库,视频也可以用它,具体用法大家可以自行百度)

pillow库(这个就不多说了,很常见)

python版本是3.6

原始图片就用小龙猫的吧,谁让它可爱呢, (๑•̀ㅂ•́)و

代码部分

import os
import imageio
from PIL import Image, ImageDraw, ImageFont

SOURCE_PATH = r'./1.gif'  # 源图片路径
OUTPUT_PATH = r'./imgs/'  # 解析路径 存放每一帧的图片
FRAMES_PATH = r'./outimg/'  # 转字符路径 存放转化为字符画的每一帧图片

def create_dir():
   if (os.path.exists(OUTPUT_PATH)):
      for file in os.listdir(OUTPUT_PATH):
         os.remove(''.join((OUTPUT_PATH, file)))
   else:
      os.makedirs(OUTPUT_PATH)


def processImage(path):
   # Iterate the GIF, extracting each frame.
   # 提取每一帧的图片,这里用捕获异常的方式遍历整个gif
   credits()
   img = Image.open(path)
   index = 0
   print('\r正在解析.....', end='')
   try:
      while True:
         img.seek(index)
         img.save('./imgs/%d.png' % index)
         index += 1
   except EOFError:
      print('\r解析完成!')


def createImg(path):
   STRS = '@#MBHA&XG893S5n1sri;:-,.  '
   # 不用字体能提高处理速度
   # font = ImageFont.truetype("consola.ttf", 10, encoding="unic")
   progress = 0
   unit = len(os.listdir('./imgs/')) / 100
   for file in os.listdir(path):
      progress += int(unit + 1)
      print('\r' + '转字符图处理:%s%.f%%' % \
            ('>' * int(progress / unit), (progress / unit)), end='')
      with Image.open(''.join((path, file))) as img:
         wide, high = img.size  # 获取图片大小
         if img.mode != 'RGB': img = img.convert("RGB")
         new_img = Image.new('1', (wide * 2, high * 2), color=255)
         draw = ImageDraw.Draw(new_img)
         for i in range(1, high, 4):  # 从上至下遍历
            for j in range(1, wide, 4):  # 从左至右遍历
               R, G, B = img.getpixel((j, i))  # 获取目标位置RGB值
               sum = R + G + B
               index = int(sum / 30)
               draw.text((j * 2, i * 2), STRS[index])
         # new_img = new_img.resize((wide, high))
         new_img.save('./outimg/' + file)
   print()


def create_gif(path, filename):
   print('\r正在生成GIF.....', end='')
   image_list = []
   num = len(os.listdir(path))
   for i in range(num):
      image_list.append('./outimg/' + str(i) + '.png')
   frames = []
   for image_name in image_list:
      frames.append(imageio.imread(image_name))
   # Save them as frames into a gif
   imageio.mimsave(filename, frames, 'GIF', duration=0.1)
   print('\r已生成GIF!')


def main():
   processImage(SOURCE_PATH)
   createImg(OUTPUT_PATH)
   create_gif(FRAMES_PATH, '001.gif')


if __name__ == '__main__':
   main()

create_gif()方法也就是把已生成每一张字符图合成GIF,由于放进 image_list[] 中的图片路径是要有顺序要求的, os.listdir() 拿到的文件名无法排序,不过呢之前生成的图片都是顺序命名的,所以这里我自己构建一个有序的路径列表给它

跑起来看看,还算不是很差

关键代码部分参考learnaLanguage的内容

原文发布于微信公众号 - 云飞学python(P542110741)

原文发表时间:2018-12-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券