作品展示——GIF动图
背景需求:
2024年3月22日,中班幼儿视力检查,保健老师表扬我们班幼儿视力正常率高。
我为每位孩子拍照时,突然想把动作图用Python变成GIF图片,于是每位孩子都拍了多张“辨认视力表的不同手势”,积累一些做GIF动画的素材。
设计过程:
第0步:把所有照片放在一个文件夹里
第1步:生成01-31的文件夹(学号文件夹)
print('------1、生成01-31的学号文件夹-------')import os
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\20240322中4班检查视力照片'
# 创建名为"123"的文件夹
os.makedirs(path, exist_ok=True)# 生成01到31的数字文件夹
for i in range(1, 32):folder_name = str(i).zfill(2) # 将数字填充成两位数,例如01、02等os.makedirs(os.path.join(path, folder_name), exist_ok=True)
放大照片,把同一位幼儿的照片,拖入相应的学号文件夹
第2步,读取每个文件夹内的高清照片,将里面的图片合并为gif
print('------1、生成01-31的学号文件夹-------')
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\20240322中4班检查视力照片'
import os
from PIL import Image# 读取123文件夹下所有的二级文件夹for root, dirs, files in os.walk(path):for dir_name in dirs:# 获取二级文件夹的路径subpath = os.path.join(root, dir_name)print(subpath)# 创建一个图像列表来存储二级文件夹中的所有图片images = []# 读取二级文件夹中的所有图片for filename in os.listdir(subpath):if filename.endswith(".png") or filename.endswith(".jpg"):image_path = os.path.join(subpath, filename)image = Image.open(image_path)images.append(image)# 将图片列表保存为gifif images:gif_path = os.path.join(root, f"{dir_name}.gif")images[0].save(gif_path, save_all=True, append_images=images[1:], duration=100, loop=0)
28个gif生成了10分钟
图片越多,gif的容量就越大(一般gif都是100K左右,但是这里用了原照片的格式,一张就2-3MB)
生成gif虽然高清,但是太大了。需要缩小容量
第3步,读取每个文件夹,将里面的图片长宽缩小到600*800,再合并为gif
查看每张照片的像素长宽,3000*4000,缩小到600*800
print('------2、转成600*800的像素的图片 gif-------')
import os
import time
from PIL import Image# 读取指定路径下所有的二级文件夹
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20240322中4班检查视力照片'for root, dirs, files in os.walk(path):for dir_name in dirs:# 获取二级文件夹的路径subpath = os.path.join(root, dir_name)print(subpath)# 创建一个图像列表来存储二级文件夹中的所有图片images = []# 读取二级文件夹中的所有图片并进行resize操作for filename in os.listdir(subpath):if filename.endswith(".png") or filename.endswith(".jpg"):image_path = os.path.join(subpath, filename)image = Image.open(image_path)# 压缩照片尺寸为指定大小,例如(200, 200)resized_image = image.resize((600, 800))images.append(resized_image)# 将压缩后的图片列表保存为gifif images:gif_path = os.path.join(root, f"{dir_name}.gif")images[0].save(gif_path, save_all=True, append_images=images[1:], duration=100, loop=0)print("生成GIF成功:", gif_path)
第4步,把所有gif生成到“gif文件夹”内
# 创建名为"零时文件夹"的文件夹new=path+r'\gif'
os.makedirs(new, exist_ok=True)
最终效果
1、素材
2、代码
'''
把幼儿检查视力的手势照片,缩小长宽 ,合并成gif
作者:AI对话大师
时间:2024年3月22日
'''
import os
import time
from PIL import Imagepath=r'C:\Users\jg2yXRZ\OneDrive\桌面\20240322中4班检查视力照片'
print('------0、生成01-31的学号文件夹-------')
path_jpg=path+r'\jpg'import os# 创建名为"20240322中4班检查视力照片"的文件夹,起始已经存在了
os.makedirs(path_jpg, exist_ok=True)# 生成01到31的数字文件夹
for i in range(1, 32):folder_name = str(i).zfill(2) # 将数字填充成两位数,例如01、02等os.makedirs(os.path.join(path_jpg, folder_name), exist_ok=True)print('------1、手动移动照片到文件夹内,以下可以不运行,等照片移动后,全部代码都显示(不用隐藏)-------')# 创建名为"储存照片的gif"的文件夹
new=path+r'\gif'
os.makedirs(new, exist_ok=True)print('------2、转成600*800的像素的图片 gif-------')# 读取指定路径下所有的二级文件夹
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20240322中4班检查视力照片'for root, dirs, files in os.walk(path_jpg):for dir_name in dirs:# 获取二级文件夹的路径subpath = os.path.join(root, dir_name)print(subpath)# 创建一个图像列表来存储二级文件夹中的所有图片images = []# 读取二级文件夹中的所有图片并进行resize操作for filename in os.listdir(subpath):if filename.endswith(".png") or filename.endswith(".jpg"):image_path = os.path.join(subpath, filename)image = Image.open(image_path)# 压缩照片尺寸为指定大小,例如(200, 200)resized_image = image.resize((600, 800))images.append(resized_image)# 将压缩后的图片列表保存为gifif images:gif_path = os.path.join(new, f"{dir_name}.gif")images[0].save(gif_path, save_all=True, append_images=images[1:], duration=100, loop=0)print("生成GIF成功:", gif_path)
3、效果
这样gif图片容量小,而且都在一个文件夹内,看起来方便、直观
远景拍摄的照片,用PS修一下,图片放大,尽量确保每张照片的人物头像大小相似。
修图后,在用代码运行一次。
最终GIF效果——逐帧动画:有没有一种指点江山的感觉
感悟:
1、本来想把这些给gif插入闵豆家园APP给家长看,但是闵豆可以传jpg\mp4\png,但是不支持gif。
2、而通过微信转移GIF,发现微信不能下载GIF(只能添加到表情)
虽然我用Python实现了批量制作照片GIF动图的结果,但是无用武之地啊。o(╥﹏╥)o