最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python制作GIF動(dòng)圖并打包為exe可執(zhí)行程序

 更新時(shí)間:2025年07月03日 10:56:57   作者:XMYX-0  
在工作或個(gè)人項(xiàng)目中,常常會(huì)遇到需要將多張圖片合成GIF動(dòng)圖的需求,同時(shí)添加版權(quán)水印保護(hù)作品,本文分享一個(gè)使用Python和Pillow庫(kù)實(shí)現(xiàn)的GIF生成工具,配備簡(jiǎn)單的Tkinter圖形界面,無(wú)論你是Python初學(xué)者,還是想快速做一個(gè)實(shí)用小工具,本文都會(huì)幫你搞定

使用 Python 制作 GIF 動(dòng)圖,并打包為 EXE 可執(zhí)行程序(含圖形界面)

在工作或個(gè)人項(xiàng)目中,常常會(huì)遇到需要將多張圖片合成 GIF 動(dòng)圖的需求,同時(shí)添加版權(quán)水印保護(hù)作品。本文分享一個(gè)使用 Python 和 Pillow 庫(kù)實(shí)現(xiàn)的 GIF 生成工具,配備簡(jiǎn)單的 Tkinter 圖形界面,支持:

  • 批量上傳圖片,合成 GIF 動(dòng)圖
  • 固定文字水印自動(dòng)添加
  • 可選圖片水印(Logo)疊加
  • 一鍵生成,操作簡(jiǎn)單
  • 使用 PyInstaller 打包為 Windows 獨(dú)立 EXE

無(wú)論你是 Python 初學(xué)者,還是想快速做一個(gè)實(shí)用小工具,這篇文章都會(huì)幫你搞定。

環(huán)境準(zhǔn)備

Python 3.6+

Pillow:圖像處理庫(kù),安裝命令:

pip install pillow
  • Tkinter:Python 內(nèi)置圖形界面庫(kù)(Windows 下默認(rèn)包含)
  • PyInstaller:后續(xù)將介紹如何打包

功能預(yù)覽

功能說(shuō)明
多圖片上傳支持多選 PNG/JPG/JPEG/BMP 等常見(jiàn)格式
GIF 動(dòng)畫(huà)生成支持循環(huán)播放,幀間隔可自定義
簡(jiǎ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 動(dòng)圖生成器")
        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)

        # 幀間隔時(shí)間
        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("未選擇圖片", "請(qǐng)先選擇圖片!")
            return

        try:
            duration = int(self.duration_var.get())
        except ValueError:
            messagebox.showerror("無(wú)效間隔", "請(qǐng)輸入合法的幀間隔(整數(shù))")
            return

        output_path = self.output_path_var.get().strip()
        if not output_path:
            messagebox.showerror("路徑錯(cuò)誤", "請(qǐng)輸入有效的保存路徑")
            return

        try:
            frames = []
            self.progress["maximum"] = len(self.image_paths)
            self.progress["value"] = 0

            from PIL import ImageFont, ImageDraw

            # ...在循環(huán)中每次讀取圖片時(shí)
            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("錯(cuò)誤", 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ù)說(shuō)明
--noconsole不顯示黑色終端窗口(適用于 GUI 程序)
--onefile打包為一個(gè)獨(dú)立 .exe 文件
--icon=app.ico自定義圖標(biāo)(可選)

生成后可在 dist/ 目錄找到 gif_creator.exe,可直接發(fā)送給他人使用,無(wú)需安裝 Python。

小貼士與拓展建議

  • 字體問(wèn)題:如果打包后字體顯示異常,建議把字體文件放到項(xiàng)目里,使用絕對(duì)路徑加載。
  • 水印透明度:可在代碼中調(diào)整 (255, 0, 0, 128) 中最后的 128 控制透明度,范圍 0~255。
  • 圖片大小限制:上傳圖片尺寸過(guò)大時(shí),合成 GIF 文件會(huì)很大,建議做圖片縮放。
  • 幀間隔調(diào)整duration=1000 單位為毫秒,可根據(jù)需求調(diào)整動(dòng)畫(huà)速度。

總結(jié)

本項(xiàng)目展示了如何使用 Python 構(gòu)建一個(gè)實(shí)用的 GIF 動(dòng)圖生成工具,并加入水印功能,最終打包成 Windows 可執(zhí)行文件,真正做到“一鍵使用、無(wú)需安裝”。

以上就是使用Python制作GIF動(dòng)圖并打包為exe可執(zhí)行程序的詳細(xì)內(nèi)容,更多關(guān)于Python制作GIF并打包為exe的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python基于OpenCV模板匹配識(shí)別圖片中的數(shù)字

    python基于OpenCV模板匹配識(shí)別圖片中的數(shù)字

    這篇文章主要介紹了python基于OpenCV模板匹配識(shí)別圖片中的數(shù)字,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • python實(shí)現(xiàn)npy格式文件轉(zhuǎn)換為txt文件操作

    python實(shí)現(xiàn)npy格式文件轉(zhuǎn)換為txt文件操作

    這篇文章主要介紹了python實(shí)現(xiàn)npy格式文件轉(zhuǎn)換為txt文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Python Missingno 數(shù)據(jù)缺失值可視化利器案例詳解

    Python Missingno 數(shù)據(jù)缺失值可視化利器案例詳解

    數(shù)據(jù)分析中數(shù)據(jù)缺失是常見(jiàn)問(wèn)題,missingno庫(kù)通過(guò)矩陣圖、條形圖等可視化工具高效識(shí)別缺失模式,適用于大型數(shù)據(jù)集,助于提升效率與決策,建議優(yōu)先使用矩陣圖并結(jié)合熱力圖分析,本文給大家介紹Python Missingno數(shù)據(jù)缺失值可視化利器,感興趣的朋友一起看看吧
    2025-06-06
  • 使用Python和wxPython開(kāi)發(fā)的Windows進(jìn)程管理工具

    使用Python和wxPython開(kāi)發(fā)的Windows進(jìn)程管理工具

    在日常使用 Windows 系統(tǒng)的過(guò)程中,我們經(jīng)常會(huì)遇到需要批量管理進(jìn)程的場(chǎng)景,Windows 自帶的任務(wù)管理器雖然功能強(qiáng)大,但在批量管理進(jìn)程方面存在明顯不足,因此,本文給大家介紹了如何使用Python和wxPython開(kāi)發(fā)的Windows進(jìn)程管理工具,需要的朋友可以參考下
    2026-01-01
  • python?pandas處理excel表格數(shù)據(jù)的常用方法總結(jié)

    python?pandas處理excel表格數(shù)據(jù)的常用方法總結(jié)

    在計(jì)算機(jī)編程中,pandas是Python編程語(yǔ)言的用于數(shù)據(jù)操縱和分析的軟件庫(kù),下面這篇文章主要給大家介紹了關(guān)于python?pandas處理excel表格數(shù)據(jù)的常用方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • python寫(xiě)的ARP攻擊代碼實(shí)例

    python寫(xiě)的ARP攻擊代碼實(shí)例

    這篇文章主要介紹了python寫(xiě)的ARP攻擊代碼實(shí)例,需要的朋友可以參考下
    2014-06-06
  • Python實(shí)現(xiàn)的文本對(duì)比報(bào)告生成工具示例

    Python實(shí)現(xiàn)的文本對(duì)比報(bào)告生成工具示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的文本對(duì)比報(bào)告生成工具,涉及Python基于difflib模塊實(shí)現(xiàn)對(duì)文本內(nèi)容進(jìn)行對(duì)比的相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • Flask表單與表單驗(yàn)證實(shí)現(xiàn)流程介紹

    Flask表單與表單驗(yàn)證實(shí)現(xiàn)流程介紹

    這篇文章主要介紹了python中Flask?Web?表單的使用方法介紹,表單的操作是Web程序開(kāi)發(fā)中最核心的模塊之一,絕大多數(shù)的動(dòng)態(tài)交互功能都是通過(guò)表單的形式實(shí)現(xiàn)的。更多介紹需要的小伙伴可以參考下面文章內(nèi)容
    2022-09-09
  • Python使用pip工具實(shí)現(xiàn)包自動(dòng)更新的多種方法

    Python使用pip工具實(shí)現(xiàn)包自動(dòng)更新的多種方法

    本文深入探討了使用Python的pip工具實(shí)現(xiàn)包自動(dòng)更新的各種方法和技術(shù),我們將從基礎(chǔ)概念開(kāi)始,逐步介紹手動(dòng)更新方法、自動(dòng)化腳本編寫(xiě)、結(jié)合CI/CD的實(shí)現(xiàn)方案,以及最佳實(shí)踐和安全考量,文章包含詳細(xì)的代碼示例、流程圖解和實(shí)際應(yīng)用場(chǎng)景分析,需要的朋友可以參考下
    2025-07-07
  • Python關(guān)于抽獎(jiǎng)系統(tǒng)的思考與設(shè)計(jì)思路

    Python關(guān)于抽獎(jiǎng)系統(tǒng)的思考與設(shè)計(jì)思路

    這篇文章主要介紹了Python關(guān)于抽獎(jiǎng)系統(tǒng)的思考與設(shè)計(jì)思路,本文通過(guò)一些簡(jiǎn)單的例子來(lái)說(shuō)一說(shuō)抽獎(jiǎng)系統(tǒng)背后的邏輯,看看究竟是你運(yùn)氣不好還是系統(tǒng)邏輯在作怪,需要的朋友可以參考下
    2023-03-03

最新評(píng)論

新沂市| 亚东县| 广水市| 英超| 大港区| 财经| 额敏县| 德昌县| 进贤县| 宣武区| 石阡县| 常宁市| 崇阳县| 图木舒克市| 黄龙县| 隆化县| 大理市| 晋城| 红原县| 额尔古纳市| 特克斯县| 田林县| 宜君县| 航空| 土默特左旗| 九龙县| 元江| 沙洋县| 平潭县| 珠海市| 古丈县| 仁化县| 都昌县| 石台县| 大同市| 晋城| 罗城| 湟源县| 绵竹市| 鹤壁市| 新河县|