把圖片列表合成一個GIF動畫圖片
- import os
- from PIL import Image
- import 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[0], reverse=True)
- heightAndFilePaths.sort(key=lambda item: item[0], reverse=True)
- if type == 4 or type == 5:
- #原圖直接合成(按寬度排序)
- if type == 4:
- for widthAndFilePath in widthAndFilePaths:
- img = Image.open(widthAndFilePath[1])
- images.append(img)
- #原圖直接合成(按高度排序)
- if type == 5:
- for heightAndFilePath in heightAndFilePaths:
- img = Image.open(heightAndFilePath[1])
- 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", [maxWidth,maxHeight], (255,255,255))
- elif type == 1 or type == 3:
- #正方形
- imgResizeAndCenter = Image.new("RGB", [maxWidthAndHeight,maxWidthAndHeight], (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 resultList
- if __name__ == "__main__":
- GetGifAnimationFromImages(r"D:\hecheng.gif", [r"D:\a.jpg", r"D:\b.jpg", r"D:\c.jpg"])
- GetGifAnimationFromImages(r"D:\hecheng1.gif", [r"D:\a.jpg", r"D:\b.jpg", r"D:\b.jpg", r"D:\c.jpg"], 1)
- GetGifAnimationFromImages(r"D:\hecheng2.gif", [r"D:\a.jpg", r"D:\b.jpg", r"D:\c.jpg"], 2)
- GetGifAnimationFromImages(r"D:\hecheng3.gif", [r"D:\a.jpg", r"D:\b.jpg", r"D:\c.jpg"], 3)
- GetGifAnimationFromImages(r"D:\hecheng4.gif", [r"D:\a.jpg", r"D:\b.jpg", r"D:\c.jpg"], 4)
- GetGifAnimationFromImages(r"D:\hecheng5.gif", [r"D:\a.jpg", r"D:\b.jpg", r"D:\c.jpg"], 5)
- GetGifAnimationFromImages(r"D:\hechengTest.gif", GetDirImageList(r"D:\GifMarker"), type = 4) </OL>
本文由用戶 quguiliang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!