好久没写文章了,今天朋友写了个简单的脚本发给我,觉得很好,经朋友同意,发来让大家看看,学习就是这样,并不是一味的学,要想办法找到它本身的乐趣,才能让我们在学习的道路上走的顺利一些。
话不多说,进入正题。
这次要用到的库是
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的内容