这是一个关于把多图片合成GIF动图的python实现方法一文,完成这项操作的大体思路如下,源码供参考,如有不足能自行修改后再使用。

#type 合成GIF分类

#0:图片缩放到最大宽度*最大高度(长方形)、并粘贴到最大宽度*最大高度(长方形)的白色背景图片中、居中后合成

#1:图片缩放到最大长度(正方形)、并粘贴到最大长度(正方形)的白色背景图片中、居中后合成

#2:图片不缩放、并粘贴到最大宽度*最大高度(长方形)的白色背景图片中、居中后合成

#3:图片不缩放、并粘贴到最大长度(正方形)的白色背景图片中、居中后合成

#4:原图直接合成(按宽度排序、不缩放也不粘贴到新的白色背景图片中)

#5:原图直接合成(按高度排序、不缩放也不粘贴到新的白色背景图片中)

import os

from PIL import Image

import images2gif

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)

#www.iplaypy.com

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)

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/code/graphics/gr2551.html

相关文章 Recommend

python合成gif动图_把多图片合成GIF动图的python实现方法相关推荐

  1. php合并多张gif图,多张静态图片合成一张动态图-静图合成动图制作

    现如今制作gif图片也不是什么难事了,巧用动态图合成软件,即能轻松将多张静态图片合成一张动态图.动态图片是由多张不同的静态图片组合而成的gif格式图片,它会按照一定的顺序和时间进行逐帧播放.做好的动态 ...

  2. 如何将一连串图片做成动图?怎么把图片做成gif动态图?

    平时我们在浏览网页或者APP的时候,经常能看到上面有一些动态的图片,这些动态图片的格式一般都是gif,最简单的gif动图一般就是由几张静态图片合并而成的,这种图其实我们自己也是可以制作的,那么应该怎么 ...

  3. python图像合成代码_python使用pil库实现图片合成实例代码

    本文研究的主要是python PIL实现图片合成的相关内容,具体介绍如下,分享实例代码. 在项目中需要将两张图片合在一起.遇到两种情况,一种就是两张非透明图片的合成, 一种是涉及到透明png的合成. ...

  4. python数据分析要学多久_如何七周成为数据分析师18:Python的新手教程

    本文是<如何七周成为数据分析师>的第十八篇教程,如果想要了解写作初衷,可以先行阅读七周指南.温馨提示:如果您已经熟悉Python,大可不必再看这篇文章,或只挑选部分. Python是近年来 ...

  5. 学完python写不出程序_我又不当程序员,为什么要学Python编程?

    记得刚毕业时,所受的第一场职场教育便是: 职场如战场,战场上只论功劳,不论苦劳. 回想起那时,无数个夜晚披星戴月加班加点,却常常被狠批在做无用功,迷茫与崩溃说来就来,甚至会觉得 " 越努力越 ...

  6. python回合制游戏教程_适合初学者练手的 10 个 有趣Python项目|python教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 想成为一个优秀的开发者,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以为之后 ...

  7. python新手入门项目推荐_适合初学者练手的 10 个 有趣Python项目

    Python Python开发 Python语言 适合初学者练手的 10 个 有趣Python项目 想成为一个优秀的开发者,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以 ...

  8. python青少年编程题目二级_青少年编程能力等级测评试卷及答案 Python编程(二级)...

    青少年编程能力等级测评试卷 Python编程(二级) (考试时间90分钟,满分100分) 一.单项选择题(共20题,每题2.5分,共50分)运行下方代码段,输出的结果是( D ). a=() prin ...

  9. python开发cad教程视频_我是编程小白,我想视频学习Python会不会能学会?

    其实Python入门并不难,只要你有足够的自信心,明确学习目标,循序渐进就能不断享受到python带给你创新的乐趣. 之前我也是看了很多python入门视频教程,个人觉得有几个还是很不错的,大家可以学 ...

  10. hdc mfc 画扇形图_使用echarts绘制条形图和扇形图

    使用echarts绘制条形图和扇形图 简单举例说明下echarts如何绘制条形图和扇形图 代码示例 echarts绘制条形图和扇形图 var mychart1=echarts.init(documen ...

最新文章

  1. C++ Opengl 绘制字体源码
  2. 打印多项式的那些坑(洛谷P1067题题解,Java语言描述)
  3. eclipse添加或者绑定约束文件
  4. 让世界没有陌生的角落共享单车时代的快与慢
  5. 深入理解Java String 池概念(String pool concept)
  6. gunicorn的用法
  7. html设置ie9兼容性视图,ie9兼容性视图设置方法
  8. 用户分层,该怎么分才合理(实操版)
  9. rm删除命令源码分析
  10. Leetcode-前缀和
  11. 比亚迪芯片BF7615BMxx芯片怎么烧录
  12. 【数学】Baby Step,Giant Step
  13. 双硬盘好还是纯固态好学计算机专业,固态硬盘虽好,但是和机械硬盘相比还是有其“不足之处”...
  14. 雷军:何以英雄背骂名!
  15. excel查找空值快捷键_CTRL+G,EXCEL中你必须要学会的快捷键
  16. 信用支付一路狂奔,未来这块蛋糕该怎么吃
  17. Codeforces 127C Hot Bath
  18. 10多个LearnDash示例和演示:从这些在线教育网站获得灵感!
  19. 网站抢购秒杀系统设计简析
  20. QT Debugging Helper Missing

热门文章

  1. 5财务分析的基本方法-盈利能力分析
  2. 计算机控制原理中雷达天线,相控阵雷达工作原理
  3. Excel 2016添加复选框
  4. Finance reading list(Mar.2019,by Stephen Nie)
  5. Spark SQL的自定义函数UDF
  6. 百度市值要被京东超越了?你投百度还是京东?
  7. 我们为什么不画高保真原型图
  8. 工具篇之Chrome浏览器所有页面崩溃(包括设置页面)的处理方法
  9. C++ 动态申请二维数组与二维数组传参
  10. GridLayout 介绍 (转载自http://www.cnblogs.com/skywang12345/p/3154150.html)