玩蛇网提供最新Python编程技术信息以及Python资源下载!

把多图片合成GIF动图的python实现方法

python 培训

这是一个关于把多图片合成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.iplaypython.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)  

玩蛇网原创,转载请注明文章出处和来源网址:http://www.iplaypython.com/code/graphics/gr2551.html



微信公众号搜索"玩蛇网Python之家"加关注,每日最新的Python资讯、图文视频教程可以让你一手全掌握。强烈推荐关注!

微信扫描下图可直接关注

玩蛇网Python新手QQ群,欢迎加入: ① 240764603 玩蛇网Python新手群
文章发布日期:2016-03-28 15:03 玩蛇网 www.iplaypython.com

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
相关文章推荐
别人正在看
特别推荐
去顶部去底部