前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python也可以边玩边学,试试做个字符画看看

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

作者头像
云飞
发布2018-12-28 11:54:20
6600
发布2018-12-28 11:54:20
举报
文章被收录于专栏:云飞学编程云飞学编程

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

话不多说,进入正题。

这次要用到的库是

os(打开文件)

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

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

python版本是3.6

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

代码部分

代码语言:javascript
复制
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的内容

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云飞学python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档