`
desert3
  • 浏览: 2139991 次
  • 性别: 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

相关推荐

    Visual C++程序开发范例宝典 - 第3章

    第3章 图形技术 3.1 绘制图形 实例104 绘制正弦曲线 实例105 绘制蜗牛曲线 实例106 绘制贝塞尔曲线 实例107 画图程序 实例108 绘制立体模型 ...实例151 使用GDI+显示GIF动画 实例152 使用GDI+实现图像格式转换

    LayeredSkin c# 动画 界面 3D

    播放,支持多张图片合成动画播放。播放Gif时候不要频繁暂停和播放动画,容易导致线程阻塞。 LayeredTextBox:Layered模式下的文本编辑器。支持水印文字设置 LayeredTrackBar:进度条控件,支持图片进度条定义 ...

    LayeredSkinDemo c# 界面 动画

    播放,支持多张图片合成动画播放。播放Gif时候不要频繁暂停和播放动画,容易导致线程阻塞。 LayeredTextBox:Layered模式下的文本编辑器。支持水印文字设置 LayeredTrackBar:进度条控件,支持图片进度条定义 ...

    FlySee(飞翔看图软件)2.3

    第二种是集合模式(模式2),该模式下会建立一个图片集合,每次打开的图片将自动加入这个列表中,图片可重复,支持目录嵌套。 搜索图像技巧:首先切换到模式二,然后打开我的电脑选中图片文件所在盘,再拖动到软件...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目源代码

    图片到图片装载器、绘制火焰效果的X坐标,Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT ...

    java开源包5

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    LayeredSkin 3D翻转,QQ概念版登录窗口等Demo

    LayeredPictureBox:支持Gif播放,支持多张图片合成动画播放。播放Gif时候不要频繁暂停和播放动画,容易导致线程阻塞。 LayeredTextBox:Layered模式下的文本编辑器。支持水印文字设置 LayeredTrackBar:进度条...

    java开源包1

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包11

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包2

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包3

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包6

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包10

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包4

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包8

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包7

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包9

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包101

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

Global site tag (gtag.js) - Google Analytics