喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!有不懂的问题可以私聊我哦!

 

gif动图制作

python制作gif动图可以用imageio库简单实现。做gif实际上就是变换连续几张图,以下是一个简单的例子。

效果图:

 

具体的代码实现:

import imageio
import glob
import cv2
from PIL import ImageFont, ImageDraw, Image
def create_gif(imagename_list, gif_name, duration=1):
 """生成gif动图,
 imagename_list:图片名字列表;
 git_name:生成的gif;
 duration:间隔时间,单位秒。
 """
 frames = []
 size = Image.open(imagename_list[0]).size # 获取第一张图的size,后面的图都resize到该size
	# 制作图片序列
 for imagename in imagename_list:
 image = Image.open(imagename)
 image = image.resize(size, Image.ANTIALIAS)
 frames.append(image)
 # 生成gif,frames是图片列表,duration是间隔时间
 imageio.mimsave(gif_name, frames, 'GIF', duration=duration)
 print("gif图制作完成")
# gif生成
filename_list = glob.glob(r'*.jpg')
create_gif(filename_list, "test.gif")

渐变的gif动图制作

想要动图看起来更加自然,效果更好的话,就需要在转换图片的时候添加一点简便的感觉。

由上面gif制作可以知道,实际上是连续转换图片即可,所以可以先生成渐变的图片,然后再将渐变的中间图片插入到两张图中间即可。

效果展示图:

 

代码实现:

import imageio
import glob
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image
def read_images(image_name_list):
 image_list = []
 size = Image.open(image_name_list[0]).size
 for image_name in image_name_list:
 image = Image.open(image_name).resize(size, Image.ANTIALIAS)
 # 转为UMat,以使用addWeighted方法
 image = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
 image_list.append(image)
 print("图片读取完成")
 return image_list
def create_gif(image_list, gif_name, duration=2, k=9):
 """生成gif动图,
 image_list:图片矩阵列表;
 git_name:生成的gif;
 duration:两张影像之间的间隔时间,单位秒。
 """
 frames = []
 
 for index in range(len(image_list)-1):
 buff = gif_gradually(image_list[index], image_list[index+1], k)
 frames.extend(buff)
 
 # 生成gif,frames是图片列表,duration是间隔时间
 imageio.mimsave(gif_name, frames, 'GIF', duration=duration/k)
 print("gif图制作完成")
def gif_gradually(img1, img2, k=10):
 """生成两张影像之间的过度影像,渐变"""
 buff = []
 for i in range(k):
 alpha = i*1/k
 # 增加权重,显示两张图片之间的过渡图片
 img = cv2.addWeighted(img1, alpha, img2, (1-alpha), gamma=0)
 # 转为PIL
 img = cv2.cvtColor(np.asarray(img), cv2.COLOR_BGR2RGB)
 buff.append(img)
 return buff
# gif生成
filename_list = glob.glob(r'*.jpg')
image_list = read_images(filename_list)
create_gif(image_list, "test.gif")

以上就是本文的所有内容,感兴趣的朋友们不妨自己动手试试!