把图片列表合成一个GIF动画图片
import osfrom PIL import Imageimport images2gif#type 合成GIF分类 #0:图片缩放到最大宽度*最大高度(长方形)、并粘贴到最大宽度*最大高度(长方形)的白色背景图片中、居中后合成#1:图片缩放到最大长度(正方形)、并粘贴到最大长度(正方形)的白色背景图片中、居中后合成#2:图片不缩放、并粘贴到最大宽度*最大高度(长方形)的白色背景图片中、居中后合成#3:图片不缩放、并粘贴到最大长度(正方形)的白色背景图片中、居中后合成#4:原图直接合成(按宽度排序、不缩放也不粘贴到新的白色背景图片中)#5:原图直接合成(按高度排序、不缩放也不粘贴到新的白色背景图片中)def GetGifAnimationFromImages(targetGifFilePath, srcImageFilePaths, type = 0): #用来合成的图片 images = [] #取得所有图片中最大长度(宽度、高度) maxWidthAndHeight = 1 #最大宽度和高度 maxWidth = 1 maxHeight = 1 #取得图片按宽度从大到小排序的路径顺序 widthAndFilePaths = [] #取得图片按高度从大到小排序的路径顺序 heightAndFilePaths = [] for imageFilePath in srcImageFilePaths: fp = open(imageFilePath, "rb") width,height = Image.open(fp).size widthAndFilePaths.append((width, imageFilePath)) heightAndFilePaths.append((height, imageFilePath)) maxWidth = max(maxWidth, width) maxHeight = max(maxHeight, height) fp.close() maxWidthAndHeight = max(maxWidthAndHeight, maxWidth, maxHeight) #降序排列 widthAndFilePaths.sort(key=lambda item: item, reverse=True) heightAndFilePaths.sort(key=lambda item: item, reverse=True) if type == 4 or type == 5: #原图直接合成(按宽度排序) if type == 4: for widthAndFilePath in widthAndFilePaths: img = Image.open(widthAndFilePath) images.append(img) #原图直接合成(按高度排序) if type == 5: for heightAndFilePath in heightAndFilePaths: img = Image.open(heightAndFilePath) images.append(img) else: for imageFilePath in srcImageFilePaths: fp = open(imageFilePath, "rb") img = Image.open(fp) width,height = img.size #生成空的白色背景图片 if type == 0 or type == 2: #长方形 imgResizeAndCenter = Image.new("RGB", , (255,255,255)) elif type == 1 or type == 3: #正方形 imgResizeAndCenter = Image.new("RGB", , (255,255,255)) if type == 0: #宽度/最大宽度>=高度/最大高度,使用小的缩放比例 if maxWidth / width >= maxHeight / height: resizeImg = img.resize((width * maxHeight / height, maxHeight),Image.ANTIALIAS) imgResizeAndCenter.paste(resizeImg, ((maxWidth - width * maxHeight / height)/ 2,0)) else: resizeImg = img.resize((maxWidth, height * maxWidth / width),Image.ANTIALIAS) imgResizeAndCenter.paste(resizeImg, (0,(maxHeight - height * maxWidth / width)/ 2)) if type == 1: #宽度>=高度,按宽度缩放到最大长度 if width >= height: resizeImg = img.resize((maxWidthAndHeight, height * maxWidthAndHeight / width),Image.ANTIALIAS) imgResizeAndCenter.paste(resizeImg, (0,(maxWidthAndHeight - height * maxWidthAndHeight / width)/ 2)) else: resizeImg = img.resize((width * maxWidthAndHeight / height, maxWidthAndHeight),Image.ANTIALIAS) imgResizeAndCenter.paste(resizeImg, ((maxWidthAndHeight - width * maxWidthAndHeight / height)/ 2, 0)) elif type == 2: imgResizeAndCenter.paste(img, ((maxWidth - width) / 2,(maxHeight - height) / 2)) elif type == 3: imgResizeAndCenter.paste(img, ((maxWidthAndHeight - width) / 2,(maxWidthAndHeight - height) / 2)) # #保存缩放居中后的图片 # imgResizeAndCenter.convert("RGB").save(os.path.dirname(imageFilePath) + os.sep + "ResizeAndCenter" + os.path.basename(imageFilePath), 'jpeg') images.append(imgResizeAndCenter) fp.close() images2gif.writeGif(targetGifFilePath, images, duration=1, nq=0.1)#取得目录下面的文件列表def GetDirImageList(dir_proc, recusive = True): resultList = [] for file in os.listdir(dir_proc): if os.path.isdir(os.path.join(dir_proc, file)): if (recusive): resultList.append(GetDirImageList(os.path.join(dir_proc, file), recusive)) continue resultList.append(os.path.join(dir_proc, file)) return resultListif __name__ == "__main__": GetGifAnimationFromImages(r"D:\hecheng.gif", ) GetGifAnimationFromImages(r"D:\hecheng1.gif", , 1) GetGifAnimationFromImages(r"D:\hecheng2.gif", , 2) GetGifAnimationFromImages(r"D:\hecheng3.gif", , 3) GetGifAnimationFromImages(r"D:\hecheng4.gif", , 4) GetGifAnimationFromImages(r"D:\hecheng5.gif", , 5) GetGifAnimationFromImages(r"D:\hechengTest.gif", GetDirImageList(r"D:\GifMarker"), type = 4)
页:
[1]