【办公类-99-06】20250512用Python制作PPT的GIF照片动图(统一图片大小、自定义不同切换秒数,以蝴蝶为例)

背景说明:

本周三就是督导复验,汇报PPT还在优化中……

原来PPT一页插入多张图片,我都是用美图的GIF做

存在问题:

1、每次都要打开链接,全选所有图片,才能导入

2、导入后的照片背景大小,默认为全部导入照片中最高、最宽的图片尺寸,导致一些小一点的照片会出现难看的白边。

3、切换时间最多2秒,而做PPT,一般最少也要3秒一张图

4、图片尺寸最大2000像素(再大就模糊了)

5、保存后输入文件名称。选择路径保存

6、需要转移GIF图片时,必须关闭美图软件,才能调用GIF图片

之前我一直觉得美图GIF比人工做切换动画方便多了,但是可选参数太少。

不过因为制作次数不多,都是用美图GIF做了。它已经提高了不少效率。

实际需求:

这次督导汇报又是大量的照片,为了能够最大化呈现照片效果,就需要合并GIF。

这次我想问问deepseek,是否可以用Python快速做JPG图片的GIF动画效果。

第1种效果:每张图片切换3秒

结果是可行的。所以我把照片默认为3秒,快速做出了GIF图片

(以蝴蝶为例)

'''
汇报PPT,把JPG图片合并为动态GIF,间隔时间可设置
deepseek,阿夏
20250512
'''

from PIL import Image
import os

m = int(input('间隔几秒
'))

def create_gif_from_images(folder_path, output_gif, target_size=(1024, 720)):
    """
    将文件夹中的所有图片合并为GIF
    
    参数:
        folder_path: 包含图片的文件夹路径
        output_gif: 输出的GIF文件名
        target_size: 目标图片大小 (宽, 高)
    """
    # 获取文件夹中所有图片文件(不含GIF图片)
    image_files = []
    for file in os.listdir(folder_path):
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.jifi')):
            image_files.append(os.path.join(folder_path, file))
    
    if not image_files:
        print("文件夹中没有找到图片文件!")
        return
    
    print(f"找到 {len(image_files)} 张图片")
    
    # 打开所有图片并调整大小
    images = []
    for i, image_file in enumerate(image_files):
        try:
            img = Image.open(image_file)
            # 直接拉伸到目标尺寸(不保持比例)
            img = img.resize(target_size, Image.LANCZOS)
            images.append(img)
        except Exception as e:
            print(f"无法处理文件 {image_file}: {e}")
    
    if not images:
        print("没有有效的图片可以处理!")
        return
    
    # 设置每帧的持续时间(毫秒)
    durations = [m * 1000] * len(images)  # 所有帧相同时间
    
    # 保存为GIF
    images[0].save(
        output_gif,
        save_all=True,
        append_images=images[1:],
        duration=durations,
        loop=0,  # 无限循环
        quality=100,  # 高质量
        optimize=True  # 优化GIF
    )
    
    print(f"GIF已成功保存为 {output_gif}")

# 使用示例
if __name__ == "__main__":
    path = r'C:Usersjg2yXRZOneDrive桌面'
    names = input('请输入文件夹名称: ')
    # 蝴蝶

    
    input_folder = os.path.join(path, names)  # 包含图片的文件夹
    output_file = os.path.join(input_folder, f"{names}.gif")  # 输出的GIF文件名
    
    # 确保输出文件夹存在
    os.makedirs(input_folder, exist_ok=True)
    
    create_gif_from_images(input_folder, output_file)

都是3秒一张

第2种效果:第一张6秒,后面照片都是3秒

第一稿完成后,园长提出一个要求:一个GIF里面第一张照片慢一点(6秒),其他照片保持原速3秒。

哇,那一刻我觉得:时也命也,命运注定我一定要用Python来做图片GIF!!!

请AI工具再满足我这个愿望

结果图片只是被放在一张白色1024*720的白色背景上,所以有大量的白边

只写了两次就成功了

微调参数

'''
汇报PPT,把JPG图片合并为动态GIF ,第一张6秒,后面都是3秒
deepseek,阿夏
20250512
'''


from PIL import Image
import os
m1=int(input('第一张几秒
'))
m2=int(input('第2-X张几秒
'))
def create_gif_from_images(folder_path, output_gif, target_size=(1024, 720)):
    """
    将文件夹中的所有图片合并为GIF
    
    参数:
        folder_path: 包含图片的文件夹路径
        output_gif: 输出的GIF文件名
        target_size: 目标图片大小 (宽, 高)
    """
    # 获取文件夹中所有图片文件
    image_files = []
    for file in os.listdir(folder_path):
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.jfif')):
            image_files.append(os.path.join(folder_path, file))
    
    if not image_files:
        print("文件夹中没有找到图片文件!")
        return
    
    print(f"找到 {len(image_files)} 张图片")
    
    # 打开所有图片并调整大小
    images = []
    for i, image_file in enumerate(image_files):
        try:
            img = Image.open(image_file)
            # 直接拉伸到目标尺寸
            img = img.resize(target_size, Image.LANCZOS)
            images.append(img)
        except Exception as e:
            print(f"无法处理文件 {image_file}: {e}")
    
    if not images:
        print("没有有效的图片可以处理!")
        return
    
    # 设置每帧的持续时间(毫秒)
    durations = [m1*1000]  # 第一帧6秒3
    durations.extend([m2*1000] * (len(images) - 1))  # 其余帧3秒
    
    # 保存为GIF
    images[0].save(
        output_gif,
        save_all=True,
        append_images=images[1:],
        duration=durations,
        loop=0,  # 无限循环
        quality=100  # 高质量
    )
    
    print(f"GIF已成功保存为 {output_gif}")

# 使用示例
if __name__ == "__main__":
    path = r'C:Usersjg2yXRZOneDrive桌面'
    names = input('请输入文件夹名称: ')
    # 蝴蝶
    input_folder = os.path.join(path, names)  # 包含图片的文件夹
    output_file = os.path.join(input_folder, f"{names}.gif")  # 输出的GIF文件名
    
    # 确保输出文件夹存在
    os.makedirs(input_folder, exist_ok=True)
    
    create_gif_from_images(input_folder, output_file)

终端输入

可以数一数,第一张是不是6秒?第2-6张是不是都是3秒。

Python制作GIF动画,比“美图秀秀的GIF动画”更快速,图片也能够统一,秒数可以自定义(每张都可以设置不同的切换描述)。

第3种效果:每张0.1秒(蝴蝶逐帧飞舞动画)

下面我把彩色蝴蝶都设置为0.1秒(秒数m要用float),做个蝴蝶飞的效果

'''
汇报PPT,把JPG图片合并为动态GIF,间隔时间可设置
deepseek,阿夏
20250512
'''

from PIL import Image
import os

m = float((input('间隔几秒
')))

def create_gif_from_images(folder_path, output_gif, target_size=(1024, 720)):
    """
    将文件夹中的所有图片合并为GIF
    
    参数:
        folder_path: 包含图片的文件夹路径
        output_gif: 输出的GIF文件名
        target_size: 目标图片大小 (宽, 高)
    """
    # 获取文件夹中所有图片文件(不含GIF图片)
    image_files = []
    for file in os.listdir(folder_path):
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.jifi')):
            image_files.append(os.path.join(folder_path, file))
    
    if not image_files:
        print("文件夹中没有找到图片文件!")
        return
    
    print(f"找到 {len(image_files)} 张图片")
    
    # 打开所有图片并调整大小
    images = []
    for i, image_file in enumerate(image_files):
        try:
            img = Image.open(image_file)
            # 直接拉伸到目标尺寸(不保持比例)
            img = img.resize(target_size, Image.LANCZOS)
            images.append(img)
        except Exception as e:
            print(f"无法处理文件 {image_file}: {e}")
    
    if not images:
        print("没有有效的图片可以处理!")
        return
    
    # 设置每帧的持续时间(毫秒)
    durations = [m * 1000] * len(images)  # 所有帧相同时间
    
    # 保存为GIF
    images[0].save(
        output_gif,
        save_all=True,
        append_images=images[1:],
        duration=durations,
        loop=0,  # 无限循环
        quality=100,  # 高质量
        optimize=True  # 优化GIF
    )
    
    print(f"GIF已成功保存为 {output_gif}")

# 使用示例
if __name__ == "__main__":
    path = r'C:Usersjg2yXRZOneDrive桌面'
    # path=r'D:20250502彩色蝴蝶'
    names = input('请输入文件夹名称: ')
    # 蝴蝶

    
    input_folder = os.path.join(path, names)  # 包含图片的文件夹
    output_file = os.path.join(input_folder, f"{names}.gif")  # 输出的GIF文件名
    
    # 确保输出文件夹存在
    os.makedirs(input_folder, exist_ok=True)
    
    create_gif_from_images(input_folder, output_file)

为了凑GIF在5MB以内,只能显示着11张图

第4种效果:等差序列递增(1,2,3,4,5……秒,每张增加1秒)

再写一个蝴蝶逐步延长时间的代码,比如第一张1秒,第2张2秒,第三张3秒……

'''
汇报PPT,把JPG图片合并为动态GIF,每张图片显示时间递增
第1张1秒,第2张2秒,第3张3秒...
deepseek,阿夏
20250512
'''

from PIL import Image
import os

m=int(input('初始秒数,然后递增1秒
'))
def create_gif_from_images(folder_path, output_gif, target_size=(1024, 720)):
    """
    将文件夹中的所有图片合并为GIF
    
    参数:
        folder_path: 包含图片的文件夹路径
        output_gif: 输出的GIF文件名
        target_size: 目标图片大小 (宽, 高)
    """
    # 获取文件夹中所有图片文件
    image_files = []
    for file in os.listdir(folder_path):
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.jfif')):
            image_files.append(os.path.join(folder_path, file))
    
    if not image_files:
        print("文件夹中没有找到图片文件!")
        return
    
    print(f"找到 {len(image_files)} 张图片")
    
    # 打开所有图片并调整大小
    images = []
    for i, image_file in enumerate(image_files):
        try:
            img = Image.open(image_file)
            # 直接拉伸到目标尺寸
            img = img.resize(target_size, Image.LANCZOS)
            images.append(img)
        except Exception as e:
            print(f"无法处理文件 {image_file}: {e}")
    
    if not images:
        print("没有有效的图片可以处理!")
        return
    
    # 设置每帧的持续时间(毫秒) - 递增时间
    durations = [(i+m)*1000 for i in range(len(images))]  # 第1张1秒,第2张2秒...
    
    # 保存为GIF
    images[0].save(
        output_gif,
        save_all=True,
        append_images=images[1:],
        duration=durations,
        loop=0,  # 无限循环
        quality=100,  # 高质量
        optimize=True  # 优化GIF
    )
    
    print(f"GIF已成功保存为 {output_gif}")

# 使用示例
if __name__ == "__main__":
    path = r'C:Usersjg2yXRZOneDrive桌面'
    names = input('请输入文件夹名称: ')
    
    input_folder = os.path.join(path, names)  # 包含图片的文件夹
    output_file = os.path.join(input_folder, f"{names}.gif")  # 输出的GIF文件名
    
    # 确保输出文件夹存在
    os.makedirs(input_folder, exist_ok=True)
    
    create_gif_from_images(input_folder, output_file)

从1秒、2秒、3秒,逐渐递增秒数

第5种效果:每张图都指定秒数

代码写出来来了,显示需要手动输入图片的一串秒数的列表

我还是改成列表吧

数一数,每张的切换秒数与设置的列表数值一致

'''
汇报PPT,把JPG图片合并为动态GIF,每张图片设置指定时间,列表设置指定时间

deepseek,阿夏
20250512
'''
from PIL import Image
import os
import ast

def create_gif_from_images(folder_path, output_gif, durations, target_size=(1024, 720)):
    """
    将文件夹中的所有图片合并为GIF
    
    参数:
        folder_path: 包含图片的文件夹路径
        output_gif: 输出的GIF文件名
        durations: 每张图片的显示时间列表(秒)
        target_size: 目标图片大小 (宽, 高)
    """
    # 获取文件夹中所有图片文件
    image_files = []
    for file in sorted(os.listdir(folder_path)):
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.jfif')):
            image_files.append(os.path.join(folder_path, file))
    
    if not image_files:
        print("文件夹中没有找到图片文件!")
        return
    
    print(f"找到 {len(image_files)} 张图片")
    
    # 检查时间列表长度是否匹配
    if len(durations) != len(image_files):
        print(f"注意:时间列表有{len(durations)}个值,图片有{len(image_files)}张")
        print("将循环使用时间设置")
    
    # 打开所有图片并调整大小
    images = []
    for i, image_file in enumerate(image_files):
        try:
            with Image.open(image_file) as img:
                # 保持宽高比调整大小
                img.thumbnail(target_size, Image.LANCZOS)
                
                # 创建新图像确保统一尺寸
                new_img = Image.new("RGB", target_size, (255, 255, 255))
                new_img.paste(img, ((target_size[0]-img.width)//2, 
                                  (target_size[1]-img.height)//2))
                images.append(new_img)
        except Exception as e:
            print(f"无法处理文件 {os.path.basename(image_file)}: {e}")
    
    if not images:
        print("没有有效的图片可以处理!")
        return
    
    # 转换秒数为毫秒,并循环使用时间列表
    durations_ms = [int(d*1000) for d in durations]
    final_durations = [durations_ms[i % len(durations_ms)] for i in range(len(images))]
    
    # 保存为GIF
    try:
        images[0].save(
            output_gif,
            save_all=True,
            append_images=images[1:],
            duration=final_durations,
            loop=0,  # 无限循环
            quality=95,
            optimize=True,
            disposal=2  # 恢复背景色
        )
        print(f"GIF已成功保存为 {output_gif}")
        print(f"文件大小: {os.path.getsize(output_gif)/1024:.1f} KB")
    except Exception as e:
        print(f"保存GIF时出错: {e}")

def get_valid_durations(prompt, default=None):
    """获取有效的时间列表输入"""
    while True:
        try:
            if default:
                print(f"默认时间设置为: {default}")
                use_default = 'y'
                # input("是否使用默认设置? (y/n): ").lower()
                if use_default == 'y':
                    return default
                
            time_input = input(prompt)
            if not time_input:
                raise ValueError("输入不能为空")
                
            # 尝试解析输入
            if time_input.startswith('[') and time_input.endswith(']'):
                durations = ast.literal_eval(time_input)
            else:
                durations = [float(x.strip()) for x in time_input.split(',')]
            
            if not all(d > 0 for d in durations):
                raise ValueError("所有时间值必须大于0")
                
            return durations
        except Exception as e:
            print(f"输入无效: {e}
请重新输入,例如: 1,2,3 或 [1,2,3]")

if __name__ == "__main__":
    # 设置默认路径和参数
    default_path = os.path.expanduser(r'C:Usersjg2yXRZOneDrive桌面')
    default_durations = [1, 2, 1, 3, 2, 4, 1, 3, 2, 4, 1, 2, 4, 3, 2, 1]
    
    print("=== JPG转GIF工具 ===")
    print(f"当前桌面路径: {default_path}")
    
    # 获取文件夹名称
    folder_name = input('请输入包含图片的文件夹名称:
').strip()
    if not folder_name:
        print("必须提供文件夹名称!")
        exit(1)
    
    # 获取时间设置
    durations = get_valid_durations(
        '请输入每张图片的显示时间(秒),用逗号分隔(例如:1,2,3):
',
        default_durations
    )
    
    # 设置路径
    input_folder = os.path.join(default_path, folder_name)
    output_file = os.path.join(input_folder, f"{folder_name}.gif")
    
    # 检查文件夹是否存在
    if not os.path.exists(input_folder):
        print(f"错误: 文件夹 '{input_folder}' 不存在!")
        exit(1)
    
    # 创建GIF
    create_gif_from_images(input_folder, output_file, durations)

感谢

万能的AI工具(星火讯飞、文心一言、豆包、智普请言、deepseek)破解了困扰我很久的PPT中GIF动画制作问题——提高了质量(可以设置图片大小、自定义秒数)、也提升了速度(几秒生成GIF)禁得起反复修改。

用AI工具做办公程序开发,效率太高了!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容