`
desert3
  • 浏览: 2159224 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

把图片列表合成一个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)
分享到:
评论
2 楼 boygirl 2011-01-07  
图像的色调会改变吗?跟原来一样不
1 楼 lerous 2010-12-21  
高手~ 请帮忙看个问题
-分析图像数据的问题

http://www.iteye.com/problems/55830

相关推荐

    giftool一个能将一系列图片帧合成GIF动画的网站

    "giftool" 是一个在线平台,专为用户提供了将一组静态图片合并成动态GIF动画的功能。这个工具对于那些需要快速、便捷地制作动图的个人或者设计师来说非常实用。通过上传一系列图片帧,用户可以轻松创建出具有视觉...

    js多张图片gif动画特效.zip

    【描述】中提到的"多张财神图片合成gif动画",这意味着开发者使用JavaScript将一系列静态的财神图片序列组合成一个连续播放的动画效果。这种技术在网页设计中常见,用于创建各种吸引人的视觉元素,如广告、提示信息...

    gif图片编辑合成工具

    4. **动画制作**:合成GIF涉及将多张图像串联起来形成动画。用户可以导入一组静态图像,然后按照所需的顺序和间隔设定来创建动画效果。 5. **优化技巧**:由于GIF文件大小的限制,了解如何优化GIF以保持质量和文件...

    java合成动画效果gif

    本文将深入探讨如何在Java中实现这样的功能,包括如何在图像上写入数字以及如何将一系列帧合成一个动画GIF。 首先,我们需要理解GIF的基本原理。GIF是一种支持多帧的图像格式,每帧可以视为一个静态图像,通过按...

    Gif_Image.rar_GIFimage_image gif_imagej gif_图片 合成GIF

    "Gif_Image.rar_GIFimage_image gif_imagej gif_图片 合成GIF"这个标题揭示了我们讨论的主题是关于如何将多个静态图片合并成一个动态的GIF动画。下面将详细介绍GIF图片的特性、制作GIF动画的方法以及可能涉及的工具...

    java实现多张png,jpg等各种图片文件转动态gif图

    3. **创建GIF动画**:初始化一个`GIF89a`对象,这将是最终的GIF动画容器。你可以设置动画的全局参数,如背景色、循环次数等。 4. **添加帧**:遍历所有要转换的图片文件,将每一张图片作为一帧添加到GIF动画中。...

    GIF动画制作软件-最新版本

    “用数张图片合成GIF动画”则是指软件的另一项核心功能——图片序列合成。用户可以导入多张静态图片,这些图片通常需要按照特定顺序排列,软件会将它们合并成一个连续播放的动画。这在制作动画故事、演示过程或者...

    好用的GIF动画制作高手

    这款软件旨在为用户提供一个便捷的平台,实现从构思到完成GIF动画的全过程。 【描述】"GIF动画制作,可以轻松地制作GIF动画" 提示我们,这款软件具有用户友好的界面和强大的功能,让即使是初学者也能快速上手。无论...

    图片压缩包合成器.rar

    标题中的“图片压缩包合成器.rar”表明这是一个用于合并图片并进行压缩的工具,很可能是一个使用易语言编写的源代码程序。易语言是一种简洁、直观的中文编程语言,旨在降低编程难度,让更多人能理解并编写程序。 ...

    gif合成工具

    在压缩包子文件的文件名称列表中,“GIF动画制作工具 V3.0.4.0”很可能就是这个gif合成工具的程序文件,版本号3.0.4.0表示这是该软件的第三个主要版本,第四次次要更新。通常,版本号的增加意味着软件的功能得到了...

    java对gif的合成与拆解Demo

    2. **创建ImageSequence**:将所有`BufferedImage`对象放入一个列表,表示gif的帧序列。 3. **创建ImageWriter**:使用`ImageIO.getImageWritersByFormatName("gif")`获取GIF格式的`ImageWriter`实例。 4. **设置...

    php生成gif动画的方法

    然后,编写一个PHP脚本,实例化`GIFEncoder`类,传递帧列表、延迟时间、循环选项等参数,并调用其方法来生成GIF动画。 总结来说,生成GIF动画的PHP方法涉及以下几个步骤: 1. 检查GD库是否可用。 2. 准备静态帧图像...

    js多张图片gif动画特效特效代码

    在JavaScript编程中,实现多张图片合成的GIF动画特效是一项常见的需求,特别是在网页动态效果设计中。这个特效代码能够将多张静态图片合并成一个动态的GIF图像,为用户提供一种有趣且吸引人的视觉体验。下面我们将...

    做gif图片工具

    【标题】:“做gif图片工具”是一个专门设计用于创建GIF动态图像的软件。在IT领域,GIF(Graphics Interchange Format)是一种流行的文件格式,它支持有限的动画效果,适用于在网络上传输简短的动画片段。这款工具的...

    GIF动态图片PictyreEx源码

    总的来说,`GIF动态图片PictyreEx源码`是一个基于MFC的GIF动态图片处理组件,它使用了GDI+进行图形渲染,并通过`PictyreEx.h` 和 `PictyreEx.cpp`两个文件实现了GIF的解析、绘制和动画播放功能。对于学习MFC编程、...

    Gifcon32 广告图片制作,多图压gif

    Gifcon32是一款专为广告设计者和营销人员打造的软件,它能够帮助用户将多张静态图片合并成富有动感的GIF动画,极大地提升了广告创意的表现力。 Gifcon32的核心功能在于其强大的图片处理和动画合成能力。这款软件...

    GIF格式演示制作工具

    通过这些功能,用户可以将一系列图片合成一个连续播放的动画,以形成具有动态效果的GIF演示。 制作GIF演示的过程一般包括以下步骤: 1. **规划内容**:确定演示的主题和每个帧要表达的信息。 2. **准备素材**:收集...

    png序列帧生成webp动画工具

    1. **批处理模式**:用户可以一次性导入多个PNG序列帧,工具会自动按照文件命名顺序进行排序并合成动画,大大提高了工作效率。 2. **参数设置**:工具通常提供多种参数供用户自定义,如帧速率、循环次数、背景色等...

    XFlow2017及之前版本用Python生成.gif的途径

    以下是一个简单的Python脚本示例,用于将一组图片合成GIF: ```python import imageio import os # 定义图片文件夹路径和输出GIF文件名 image_folder = 'path/to/your/images' output_gif = 'output.gif' # 获取...

    png转gif 绿色汉化版

    在提供的压缩包文件名称列表中,我们可以看到一个名为"BatchImageConvert.exe"的文件。这很可能是这个图像转换工具的可执行程序。用户只需运行这个程序,按照界面提示选择待转换的PNG文件,设置输出格式、尺寸调整和...

Global site tag (gtag.js) - Google Analytics