• Gif图片分解(支持批量)


    在前面做过一个Gif图片合成的小工具,老朋友应该有所印象。但是,近段时间有人反映合成了的Gif图片该如何进行分解呢?

    于是,再次了解了一下PIL模块的Image,果真是可以做动图分解的。

    1、模块安装

    使用PIL库,实际上是来源于pillow库的兼容,因此需要安装pillow非标准库。

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow
    
    • 1

    2、模块导入

    安装好pillow非标准库之后,将PIL模块中Image图像处理模块导入到代码块中即可。

    from PIL import Image
    
    • 1

    同时,将os系统操作模块导入进来用于对文件夹或文件来进行操作。

    import os
    
    • 1

    导入一个日志模块loguru来记录日志打印,在之前的文章中也介绍过,由于这个模块导入即用比较方便我们这里直接使用它来打印日志。

    from loguru import logger
    
    • 1

    3、分解动图

    这里,我们的目的是将一个Gif图片直接分解成png格式的多个图片。首先对单张动态图片完成分解。

    创建一个函数sptGif,来实现对单张Gif图片分解的过程。

    def spt_gif_one(gif_path, tar_dir, format="png"):
        '''
        分解单张Gif图片
        :param gif_path: Gif 图片路径
        :param tar_dir: 分解后的存储路径
        :param format: 分解成的图片格式,默认为PNG格式的图片
        :return:
        '''
        gif_file_name = os.path.basename(gif_path)
        logger.info("当前gif动态图片路径:{}".format(gif_file_name))
        base_name = str(gif_file_name).split('.')[0]
        image = Image.open(gif_path)
        for n in range(image.n_frames):
            gen_file_name = base_name + '_' + str(n)
            image.seek(n)
            image_new = Image.new("RGBA", image.size)
            image_new.paste(image)
            image_new.save(os.path.join(tar_dir, "%s.%s" % (gen_file_name, format)))
            logger.info('文件名称:{}已生成!'.format(gen_file_name))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4、批量分解

    若是在gif图片比较到的情况下,则可以选择批量分解的方式来进行分解。

    一般选择将所有需要分解的gif图片直接放在统一的文件夹下面来完成批量分解。实现思路是通过遍历该文件夹下面的所有的gif图片挨个对其完成分解。

    def spt_gif_batch(gif_dir, tar_dir):
        '''
        批量分解Gif动态图片
        :param gif_dir:
        :param tar_dir:
        :return:
        '''
        if os.path.isdir(gif_dir):
            files = os.listdir(gif_dir)
            for file in files:
                gif_path = os.path.join(gif_dir, file)
                if os.path.splitext(gif_path)[1] in '.gif':
                    spt_gif_one(gif_path, tar_dir)
                else:
                    logger.info('{} 文件格式检查不正确!'.format(gif_path))
        else:
            logger.info('{} 文件夹不存在!'.format(gif_dir))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    5、生成效果

    我调用批量生成的函数spt_gif_batch进行了效果测试。

    从Google上面直接下载一张Gif的动态图片,原图是这样的效果。

    太空行走.gif

    随后,对其进行了批量分解的执行,os.getcwd()表示生成的图片放在当前的路径下面。

    spt_gif_batch(os.getcwd(), os.getcwd())
    
    • 1

    控制台这时也按照预期打印出了日志,日志还是比较漂亮的,哈哈~

    动图分解日志.png

    完成后,总共生成了25张png格式的图片,我下面跳了其中的几张展示出来。

    太空行走_0.png

    太空行走_10.png

    太空行走_24.png

  • 相关阅读:
    java mysql ssm框架的同城配送系统源码
    【设计模式深度剖析】【4】【结构型】【组合模式】| 以文件系统为例加深理解
    2022.07 排列组合
    客户关系管理系统(CRM)开发的意义ai智能机器人okcc
    【Linux信号专题】二、信号是如何产生的
    后端研发工程师面经——数据结构
    【Linux】shell命令行简单解释器
    Linux Docker容器配置
    Java 新手如何使用Spring MVC 中的查询字符串和查询参数?
    数位统计DP
  • 原文地址:https://blog.csdn.net/chengxuyuan_110/article/details/126333931