使用 Python 制作 GIF 动图,并打包为 EXE 可执行程序
文章目录
- 成品百度网盘下载
- 🎬 使用 Python 制作 GIF 动图,并打包为 EXE 可执行程序(含图形界面)
- 🧰 环境准备
- 💻 功能预览
- 🧑💻 完整代码(图形界面 + 功能)
- 如何打包成 Windows 可执行程序(`.exe`)
- 安装命令
- 打包命令
- 小贴士与拓展建议
- ✅ 总结
成品百度网盘下载
百度网盘下载
🎬 使用 Python 制作 GIF 动图,并打包为 EXE 可执行程序(含图形界面)
在工作或个人项目中,常常会遇到需要将多张图片合成 GIF 动图的需求,同时添加版权水印保护作品。本文分享一个使用 Python 和 Pillow 库实现的 GIF 生成工具,配备简单的 Tkinter 图形界面,支持:
- 批量上传图片,合成 GIF 动图
- 固定文字水印自动添加
- 可选图片水印(Logo)叠加
- 一键生成,操作简单
- 使用 PyInstaller 打包为 Windows 独立 EXE
无论你是 Python 初学者,还是想快速做一个实用小工具,这篇文章都会帮你搞定。
🧰 环境准备
-
Python 3.6+
-
Pillow:图像处理库,安装命令:
pip install pillow
-
Tkinter:Python 内置图形界面库(Windows 下默认包含)
-
PyInstaller:后续将介绍如何打包
💻 功能预览
功能 | 说明 |
---|---|
多图片上传 | 支持多选 PNG/JPG/JPEG/BMP 等常见格式 |
GIF 动画生成 | 支持循环播放,帧间隔可自定义 |
简洁图形界面 | 按钮操作:选择图片、生成 GIF |
一键生成 | 直接点击按钮即可生成 |
EXE 打包 | 使用 PyInstaller 一键打包,免 Python 环境 |
🧑💻 完整代码(图形界面 + 功能)
gif_creator.py
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from PIL import Image, ImageTk
import os
import threading
import webbrowserclass GifMakerApp:def __init__(self, root):self.root = rootself.root.title("GIF 动图生成器")self.image_paths = []self.build_ui()def build_ui(self):# 图片列表框self.listbox = tk.Listbox(self.root, selectmode=tk.SINGLE, width=50, height=8)self.listbox.grid(row=0, column=0, columnspan=3, padx=10, pady=5)# 上移/下移按钮tk.Button(self.root, text="↑ 上移", command=self.move_up).grid(row=1, column=0, sticky="ew", padx=10)tk.Button(self.root, text="↓ 下移", command=self.move_down).grid(row=1, column=1, sticky="ew", padx=10)# 选择图片tk.Button(self.root, text="选择图片", command=self.select_images).grid(row=2, column=0, columnspan=2, pady=5)# 帧间隔时间tk.Label(self.root, text="帧间隔 (ms):").grid(row=3, column=0, sticky="e")self.duration_var = tk.IntVar(value=1000)tk.Entry(self.root, textvariable=self.duration_var, width=8).grid(row=3, column=1, sticky="w")# 选择保存路径tk.Button(self.root, text="保存路径", command=self.choose_output_path).grid(row=4, column=0, pady=5)self.output_path_var = tk.StringVar(value="output.gif")tk.Entry(self.root, textvariable=self.output_path_var, width=30).grid(row=4, column=1)# 进度条self.progress = ttk.Progressbar(self.root, orient="horizontal", length=300, mode="determinate")self.progress.grid(row=5, column=0, columnspan=3, pady=5)# 生成按钮tk.Button(self.root, text="生成 GIF", command=self.generate_gif_thread).grid(row=6, column=0, columnspan=3, pady=10)def select_images(self):file_paths = filedialog.askopenfilenames(title="选择多张图片",filetypes=[("图片文件", "*.png *.jpg *.jpeg *.bmp")])if file_paths:self.image_paths = list(file_paths)self.refresh_listbox()def refresh_listbox(self):self.listbox.delete(0, tk.END)for path in self.image_paths:self.listbox.insert(tk.END, os.path.basename(path))def move_up(self):index = self.listbox.curselection()if not index or index[0] == 0:returnidx = index[0]self.image_paths[idx-1], self.image_paths[idx] = self.image_paths[idx], self.image_paths[idx-1]self.refresh_listbox()self.listbox.select_set(idx-1)def move_down(self):index = self.listbox.curselection()if not index or index[0] == len(self.image_paths) - 1:returnidx = index[0]self.image_paths[idx+1], self.image_paths[idx] = self.image_paths[idx], self.image_paths[idx+1]self.refresh_listbox()self.listbox.select_set(idx+1)def choose_output_path(self):path = filedialog.asksaveasfilename(defaultextension=".gif",filetypes=[("GIF 文件", "*.gif")],title="选择 GIF 保存路径")if path:self.output_path_var.set(path)def generate_gif_thread(self):t = threading.Thread(target=self.generate_gif)t.start()def generate_gif(self):if not self.image_paths:messagebox.showwarning("未选择图片", "请先选择图片!")returntry:duration = int(self.duration_var.get())except ValueError:messagebox.showerror("无效间隔", "请输入合法的帧间隔(整数)")returnoutput_path = self.output_path_var.get().strip()if not output_path:messagebox.showerror("路径错误", "请输入有效的保存路径")returntry:frames = []self.progress["maximum"] = len(self.image_paths)self.progress["value"] = 0from PIL import ImageFont, ImageDraw# ...在循环中每次读取图片时for idx, path in enumerate(self.image_paths):img = Image.open(path).convert("RGBA")if idx == 0:w, h = img.sizeelse:img = img.resize((w, h))# 添加水印draw = ImageDraw.Draw(img)text = "@ CSDN博主XMYX-0"font_size = 50try:# Windows 通用字体路径(可自定义)# font = ImageFont.truetype("arial.ttf", font_size)font = ImageFont.truetype("C:/Windows/Fonts/simhei.ttf", font_size)except:font = ImageFont.load_default()bbox = draw.textbbox((0, 0), text, font=font)text_width = bbox[2] - bbox[0]text_height = bbox[3] - bbox[1]position = (w - text_width - 10, h - text_height - 10) # 右下角draw.text(position, text, font=font, fill=(255, 0, 0, 128)) # 半透明红色水印frames.append(img)self.progress["value"] += 1self.root.update_idletasks()frames[0].save(output_path,save_all=True,append_images=frames[1:],duration=duration,loop=0)messagebox.showinfo("成功", f"GIF 已生成:\n{output_path}")webbrowser.open(output_path)except Exception as e:messagebox.showerror("错误", f"生成失败:\n{str(e)}")if __name__ == "__main__":root = tk.Tk()app = GifMakerApp(root)root.mainloop()
如何打包成 Windows 可执行程序(.exe
)
我们可以使用 PyInstaller 进行打包:
安装命令
pip install pyinstaller
打包命令
pyinstaller --noconsole --onefile --icon=app.ico gif_creator.py
参数 | 说明 |
---|---|
--noconsole | 不显示黑色终端窗口(适用于 GUI 程序) |
--onefile | 打包为一个独立 .exe 文件 |
--icon=app.ico | 自定义图标(可选) |
生成后可在 dist/
目录找到 gif_creator.exe
,可直接发送给他人使用,无需安装 Python。
小贴士与拓展建议
- 字体问题:如果打包后字体显示异常,建议把字体文件放到项目里,使用绝对路径加载。
- 水印透明度:可在代码中调整
(255, 0, 0, 128)
中最后的128
控制透明度,范围 0~255。 - 图片大小限制:上传图片尺寸过大时,合成 GIF 文件会很大,建议做图片缩放。
- 帧间隔调整:
duration=1000
单位为毫秒,可根据需求调整动画速度。
✅ 总结
本项目展示了如何使用 Python 构建一个实用的 GIF 动图生成工具,并加入水印功能,最终打包成 Windows 可执行文件,真正做到“一键使用、无需安装”。
相关文章:
使用 Python 制作 GIF 动图,并打包为 EXE 可执行程序
文章目录 成品百度网盘下载🎬 使用 Python 制作 GIF 动图,并打包为 EXE 可执行程序(含图形界面)🧰 环境准备💻 功能预览🧑💻 完整代码(图形界面 功能)如何…...

HarmonyOS Next 弹窗系列教程(2)
HarmonyOS Next 弹窗系列教程(2) 上一章节我们讲了自定义弹出框 (openCustomDialog),那对于一些简单的业务场景,不一定需要都是自定义,也可以使用 HarmonyOS Next 内置的一些弹窗效果。比如: 名称描述不依…...
Ubuntu 18.04 上源码安装 protobuf 3.7.0
🔧 1️⃣ 安装依赖 sudo apt update sudo apt install -y autoconf automake libtool curl make g unzip📥 2️⃣ 下载源码 cd ~ git clone https://github.com/protocolbuffers/protobuf.git cd protobuf git checkout v3.7.0⚙️ 3️⃣ 编译 & 安…...

中小企业搭建网站选择虚拟主机还是云服务器?华为云有话说
这是一个很常见的问题,许多小企业在搭建网站时都会面临这个选择。虚拟主机和云服务器都有各自的优缺点,需要根据自己的需求和预算来决定。 虚拟主机是指将一台物理服务器分割成多个虚拟空间,每个空间都可以运行一个网站。虚拟主机的优点是价格…...

使用 HTML + JavaScript 在高德地图上实现物流轨迹跟踪系统
在电商行业蓬勃发展的今天,物流信息查询已成为人们日常生活中的重要需求。本文将详细介绍如何基于高德地图 API 利用 HTML JavaScript 实现物流轨迹跟踪系统的开发。 效果演示 项目概述 本项目主要包含以下核心功能: 地图初始化与展示运单号查询功能…...

19-项目部署(Linux)
Linux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天所学习的Linux也是一款操作系统。 我们作为javaEE开发工程师,将来在企业中开发时会涉及到很多的数据库、中间件等技术&#…...

html基础01:前端基础知识学习
html基础01:前端基础知识学习 1.个人建立打造 -- 之前知识的小总结1.1个人简历展示1.2简历信息填写页面 1.个人建立打造 – 之前知识的小总结 1.1个人简历展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…...
Golang学习之旅
Golang学习之旅:初探Go语言的奥秘 在当今这个快速发展的技术时代,编程语言层出不穷,每一种都有其独特的魅力和适用场景。作为一名对技术充满热情的开发者,我一直在探索新的知识,以提升自己的编程技能。最近࿰…...

【RoadRunner】自动驾驶模拟3D场景构建 | 软件简介与视角控制
💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…...

基于RK3576+FPGA芯片构建的CODESYS软PLC Linux实时系统方案,支持6T AI算力
基于RK3576芯片构建的CODESYS软PLC Linux实时系统方案,结合了异构计算架构与工业实时控制技术,主要特点如下: 一、硬件架构设计 异构多核协同 Cortex-A72四核(2.3GHz):处理运动轨迹规划、AI视觉等…...
鸿蒙OSUniApp复杂表单与动态验证实践:打造高效的移动端表单解决方案#三方框架 #Uniapp
UniApp复杂表单与动态验证实践:打造高效的移动端表单解决方案 引言 在移动应用开发中,表单处理一直是一个既常见又具有挑战性的任务。随着HarmonyOS生态的蓬勃发展,越来越多的开发者开始关注跨平台解决方案。本文将深入探讨如何使用UniApp框…...
在linux系统上搭建git服务器(ssh协议)
1.在windows上生成RSA密钥对 ssh-keygen -t rsa -b 2048 -C"git用户名/邮箱地址" 命令执行后会在 C:\Users\${windows登录账户}\.ssh 目录下生成密钥对 其中 id_rsa 为私钥,id_rsa.pub 为公钥 2.在 linux 系统上登记公钥 vim ~/.ssh/authorized_keys…...

适配器模式:让不兼容接口协同工作
文章目录 1. 适配器模式概述2. 适配器模式的分类2.1 类适配器2.2 对象适配器 3. 适配器模式的结构4. C#实现适配器模式4.1 对象适配器实现4.2 类适配器实现 5. 适配器模式的实际应用场景5.1 第三方库集成5.2 遗留系统集成5.3 系统重构与升级5.4 跨平台开发 6. 类适配器与对象适…...
NodeJS全栈开发面试题讲解——P12高性能场景题
12.1 设计一个高并发点赞接口,如何优化性能? 设计要点: 问题: 点赞操作是高频写操作,数据库直接写可能成为瓶颈。 优化方案: 缓存计数 异步落库 点赞先写缓存(Redis Hash / Sorted Set&…...

DDP与FSDP:分布式训练技术全解析
DDP与FSDP:分布式训练技术全解析 DDP(Distributed Data Parallel)和 FSDP(Fully Sharded Data Parallel)均为用于深度学习模型训练的分布式训练技术,二者借助多 GPU 或多节点来提升训练速度。 1. DDP(Distributed Data Parallel) 实现原理 数据并行:把相同的模型复…...

【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(1)——Chat Client API
Spring AI框架快速入门 一、前言二、前期准备2.1 运行环境2.2 maven配置2.3 api-key申请 三、Chat Client API3.1 导入pom依赖3.2 配置application.properties文件3.3 创建 ChatClient3.3.1 使用自动配置的 ChatClient.Builder3.3.2 使用多个聊天模型 3.4 ChatClient请求3.5 Ch…...

【笔记】在 MSYS2(MINGW64)中正确安装 Rust
#工作记录 1. 环境信息 Windows系统: MSYS2 MINGW64当前时间: 2025年6月1日Rust 版本: rustc 1.87.0 (17067e9ac 2025-05-09) (Rev2, Built by MSYS2 project) 2. 安装步骤 步骤 1: 更新系统包数据库并升级已安装的包 首先,确保我们的 MSYS2 系统是最新状态。打…...

从汇编的角度揭秘C++引用,豁然开朗
C中的引用是指已有对象的别名,可以通过该别名访问并修改被引用的对象。那么其背后的原理是什么呢?引用是否会带来额外的开销呢?我们从一段代码入手,来分析一下引用的本质。 #include <stdio.h> int main() {int a 10;int …...
设计模式系列(07):建造者模式(Builder)
本文为设计模式系列第7篇,聚焦创建型模式中的建造者模式,涵盖定义、原理、实际业务场景、优缺点、最佳实践及详细代码示例,适合系统学习与实战应用。 目录 1. 模式概述2. 使用场景3. 优缺点分析4. 实际应用案例5. 结构与UML类图6. 代码示例7…...
Maven 项目中集成数据库文档生成工具
在 Maven 项目中,可以通过集成 数据库文档生成工具(如 screw-maven-plugin、mybatis-generator 或 liquibase)来自动生成数据库文档。以下是使用 screw-maven-plugin(推荐)的完整配置步骤: 1. 添加插件配置…...

聊聊Tomato Architecture
序 本文主要研究一下Tomato Architecture Clean/Onion/Hexagonal/Ports&Adapters Architectures Clean Architecture clean architecture定义了四层结构,最内层是entities(enterprise business rules),再往外是use cases(application business ru…...

小白的进阶之路系列之十二----人工智能从初步到精通pytorch综合运用的讲解第五部分
在本笔记本中,我们将针对Fashion-MNIST数据集训练LeNet-5的变体。Fashion-MNIST是一组描绘各种服装的图像瓦片,有十个类别标签表明所描绘的服装类型。 # PyTorch model and training necessities import torch import torch.nn as nn import torch.nn.functional as F impor…...
Java并发编程实战 Day 6:Future与异步编程模型
【Java并发编程实战 Day 6】Future与异步编程模型 在今天的课程中,我们将深入学习Java中的Future与异步编程模型。这是为期30天的"Java并发编程实战"系列的第6天。 理论基础 Future接口 Future接口是Java提供的用于表示异步计算的结果。它提供了以下方…...
.NET Core 中预防跨网站请求伪造 (XSRFCSRF) 攻击
.NET Core 中预防跨网站请求伪造 (XSRF/CSRF) 攻击 在如今的网络环境中,安全问题一直是开发者们不可忽视的重要方面。跨网站请求伪造(Cross-Site Request Forgery,简称 CSRF)就是一种常见且具有威胁性的网络攻击方式。攻击者通过…...
MFC Resource.h 文件详解与修改指南
MFC Resource.h 文件详解与修改指南 Resource.h 是 Visual C 和 MFC 项目中用于集中管理资源标识符(Resource ID)的头文件。它由 Visual Studio 的资源编辑器自动生成并维护,也可以手动编辑。理解并合理使用该文件对于管理对话框、控件、菜单…...

2025年06月03日Github流行趋势
项目名称:onlook 项目地址url:https://github.com/onlook-dev/onlook项目语言:TypeScript历史star数:12871今日star数:624项目维护者:Kitenite, drfarrell, spartan-vutrannguyen, apps/devin-ai-integrati…...
AI视频编码器(0.4.3) 调试训练bug——使用timm SoftTargetCrossEntropy时出现loss inf
检查过程 进入loss内部实现: > /root/miniconda3/envs/UMT2/lib/python3.9/site-packages/timm/loss/cross_entropy.py(35...

【数据分析】基于Cox模型的R语言实现生存分析与生物标志物风险评估
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理生存分析画图输出图片其他标记物的分析总结系统信息介绍 分析生存数据与多种生物标志物之间的关系。它通过Cox比例风险模型来评估不同生物标志物…...

使用nginx配置反向代理,负载均衡
首先啥叫反向代理 咋配置呢,那当然是在nginx目录下改conf文件了 具体咋改呢,那就新增一个新的server配置,然后在location里新增你想代理的服务器 实际上负载均衡也就是根据反向代理的思路来的,如下所示 配置的话实际上也与上…...

从 iPhone 备份照片: 保存iPhone图片的5种方法
随着智能手机越来越融入我们的生活,我们的照片已成为我们设备上最有价值的数据形式之一。然而,iPhone内部存储空间仍然有限,因此我们需要将iPhone中的照片备份到另一个地方,以释放空间并确保珍贵的图像记忆的安全。阅读本指南&…...