使用Python制作GIF動圖并打包為exe可執(zhí)行程序
使用 Python 制作 GIF 動圖,并打包為 EXE 可執(zhí)行程序(含圖形界面)
在工作或個人項目中,常常會遇到需要將多張圖片合成 GIF 動圖的需求,同時添加版權(quán)水印保護(hù)作品。本文分享一個使用 Python 和 Pillow 庫實現(xiàn)的 GIF 生成工具,配備簡單的 Tkinter 圖形界面,支持:
- 批量上傳圖片,合成 GIF 動圖
- 固定文字水印自動添加
- 可選圖片水?。↙ogo)疊加
- 一鍵生成,操作簡單
- 使用 PyInstaller 打包為 Windows 獨(dú)立 EXE
無論你是 Python 初學(xué)者,還是想快速做一個實用小工具,這篇文章都會幫你搞定。
環(huán)境準(zhǔn)備
Python 3.6+
Pillow:圖像處理庫,安裝命令:
pip install pillow
- Tkinter:Python 內(nèi)置圖形界面庫(Windows 下默認(rèn)包含)
- PyInstaller:后續(xù)將介紹如何打包
功能預(yù)覽
| 功能 | 說明 |
|---|---|
| 多圖片上傳 | 支持多選 PNG/JPG/JPEG/BMP 等常見格式 |
| GIF 動畫生成 | 支持循環(huán)播放,幀間隔可自定義 |
| 簡潔圖形界面 | 按鈕操作:選擇圖片、生成 GIF |
| 一鍵生成 | 直接點(diǎn)擊按鈕即可生成 |
| EXE 打包 | 使用 PyInstaller 一鍵打包,免 Python 環(huán)境 |
完整代碼(圖形界面 + 功能)
gif_creator.py
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from PIL import Image, ImageTk
import os
import threading
import webbrowser
class GifMakerApp:
def __init__(self, root):
self.root = root
self.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)
# 進(jìn)度條
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:
return
idx = 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:
return
idx = 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("未選擇圖片", "請先選擇圖片!")
return
try:
duration = int(self.duration_var.get())
except ValueError:
messagebox.showerror("無效間隔", "請輸入合法的幀間隔(整數(shù))")
return
output_path = self.output_path_var.get().strip()
if not output_path:
messagebox.showerror("路徑錯誤", "請輸入有效的保存路徑")
return
try:
frames = []
self.progress["maximum"] = len(self.image_paths)
self.progress["value"] = 0
from PIL import ImageFont, ImageDraw
# ...在循環(huán)中每次讀取圖片時
for idx, path in enumerate(self.image_paths):
img = Image.open(path).convert("RGBA")
if idx == 0:
w, h = img.size
else:
img = img.resize((w, h))
# 添加水印
draw = ImageDraw.Draw(img)
text = "@ CSDN博主XMYX-0"
font_size = 50
try:
# 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"] += 1
self.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 可執(zhí)行程序(.exe)
我們可以使用 PyInstaller 進(jìn)行打包:
安裝命令
pip install pyinstaller
打包命令
pyinstaller --noconsole --onefile --icon=app.ico gif_creator.py
| 參數(shù) | 說明 |
|---|---|
| --noconsole | 不顯示黑色終端窗口(適用于 GUI 程序) |
| --onefile | 打包為一個獨(dú)立 .exe 文件 |
| --icon=app.ico | 自定義圖標(biāo)(可選) |
生成后可在 dist/ 目錄找到 gif_creator.exe,可直接發(fā)送給他人使用,無需安裝 Python。
小貼士與拓展建議
- 字體問題:如果打包后字體顯示異常,建議把字體文件放到項目里,使用絕對路徑加載。
- 水印透明度:可在代碼中調(diào)整
(255, 0, 0, 128)中最后的128控制透明度,范圍 0~255。 - 圖片大小限制:上傳圖片尺寸過大時,合成 GIF 文件會很大,建議做圖片縮放。
- 幀間隔調(diào)整:
duration=1000單位為毫秒,可根據(jù)需求調(diào)整動畫速度。
總結(jié)
本項目展示了如何使用 Python 構(gòu)建一個實用的 GIF 動圖生成工具,并加入水印功能,最終打包成 Windows 可執(zhí)行文件,真正做到“一鍵使用、無需安裝”。
以上就是使用Python制作GIF動圖并打包為exe可執(zhí)行程序的詳細(xì)內(nèi)容,更多關(guān)于Python制作GIF并打包為exe的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python基于OpenCV模板匹配識別圖片中的數(shù)字
這篇文章主要介紹了python基于OpenCV模板匹配識別圖片中的數(shù)字,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03
python實現(xiàn)npy格式文件轉(zhuǎn)換為txt文件操作
這篇文章主要介紹了python實現(xiàn)npy格式文件轉(zhuǎn)換為txt文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Python Missingno 數(shù)據(jù)缺失值可視化利器案例詳解
數(shù)據(jù)分析中數(shù)據(jù)缺失是常見問題,missingno庫通過矩陣圖、條形圖等可視化工具高效識別缺失模式,適用于大型數(shù)據(jù)集,助于提升效率與決策,建議優(yōu)先使用矩陣圖并結(jié)合熱力圖分析,本文給大家介紹Python Missingno數(shù)據(jù)缺失值可視化利器,感興趣的朋友一起看看吧2025-06-06
使用Python和wxPython開發(fā)的Windows進(jìn)程管理工具
在日常使用 Windows 系統(tǒng)的過程中,我們經(jīng)常會遇到需要批量管理進(jìn)程的場景,Windows 自帶的任務(wù)管理器雖然功能強(qiáng)大,但在批量管理進(jìn)程方面存在明顯不足,因此,本文給大家介紹了如何使用Python和wxPython開發(fā)的Windows進(jìn)程管理工具,需要的朋友可以參考下2026-01-01
python?pandas處理excel表格數(shù)據(jù)的常用方法總結(jié)
在計算機(jī)編程中,pandas是Python編程語言的用于數(shù)據(jù)操縱和分析的軟件庫,下面這篇文章主要給大家介紹了關(guān)于python?pandas處理excel表格數(shù)據(jù)的常用方法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Python使用pip工具實現(xiàn)包自動更新的多種方法
本文深入探討了使用Python的pip工具實現(xiàn)包自動更新的各種方法和技術(shù),我們將從基礎(chǔ)概念開始,逐步介紹手動更新方法、自動化腳本編寫、結(jié)合CI/CD的實現(xiàn)方案,以及最佳實踐和安全考量,文章包含詳細(xì)的代碼示例、流程圖解和實際應(yīng)用場景分析,需要的朋友可以參考下2025-07-07
Python關(guān)于抽獎系統(tǒng)的思考與設(shè)計思路
這篇文章主要介紹了Python關(guān)于抽獎系統(tǒng)的思考與設(shè)計思路,本文通過一些簡單的例子來說一說抽獎系統(tǒng)背后的邏輯,看看究竟是你運(yùn)氣不好還是系統(tǒng)邏輯在作怪,需要的朋友可以參考下2023-03-03

