红穆笔记
首頁 語言筆記 python批量壓縮網站圖片,給網站實現瘦身!
語言筆記 python

python批量壓縮網站圖片,給網站實現瘦身!

python批量压缩网站图片,给网站实现瘦身!

我網站就因爲圖片很大,所以打開超級慢。

於是就想到了用python來壓縮圖片。

png壓縮成webp格式,直接瘦身88%!

20260730211430809-image

壓縮率很高,但卻很清晰,1.4G的png直接壓縮到120M,而且很高清,請問還有誰?!

Python 腳本的功能:

  1. 遞歸遍歷 uploads 目錄下的所有文件。

  2. 跳過 小於等於 300KB 的文件。

  3. 檢測真實圖片格式(通過文件頭,而非擴展名),如果已經是 WebP 格式則跳過。

  4. 將 PNG、JPG、JPEG、BMP、TIFF 等圖片壓縮爲 WebP,質量設爲 85(可調)。

  5. 保持原文件名和擴展名不變(例如 example.png 仍爲 example.png,但內容是 WebP)。

  6. 備份原文件 到指定的備份目錄(保留完整相對路徑)。

  7. 跳過非圖片文件(如 .zip.pdf.txt 等)。

python代碼:

import os
import shutil
from PIL import Image

# ---------- 配置 ----------
SOURCE_DIR = r"Z:\path\to\your\uploads"  # 替換爲你的 uploads 目錄路徑
BACKUP_DIR = r"Z:\path\to\backup\uploads"  # 備份目錄(原文件移動到這裏)
QUALITY = 85  # WebP 壓縮質量 (1-100)
SIZE_THRESHOLD = 300 * 1024  # 300KB

# 支持的圖片擴展名(即使擴展名不對,也會通過文件頭檢測)
IMAGE_EXTS = {'.png', '.jpg', '.jpeg', '.bmp', '.tiff', '.tif', '.webp'}

# ---------- 核心函數 ----------
def is_webp(filepath):
    """通過文件頭判斷是否爲 WebP 格式"""
    with open(filepath, 'rb') as f:
        header = f.read(12)
    return header[:4] == b'RIFF' and header[8:12] == b'WEBP'

def compress_to_webp(src_path, dst_path, quality):
    """將圖片壓縮爲 WebP 並保存到 dst_path(保持擴展名不變)"""
    with Image.open(src_path) as img:
        # 處理透明度:RGBA 保留,其他轉 RGB
        if img.mode in ('RGBA', 'LA', 'P'):
            img = img.convert('RGBA')
        else:
            img = img.convert('RGB')
        # 保存爲 WebP,但文件名擴展名不變(瀏覽器根據文件頭識別)
        img.save(dst_path, 'WEBP', quality=quality, method=6)

# ---------- 主程序 ----------
def main():
    if not os.path.exists(SOURCE_DIR):
        print(f"❌ 源目錄不存在:{SOURCE_DIR}")
        return

    os.makedirs(BACKUP_DIR, exist_ok=True)

    total_files = 0
    processed = 0
    skipped_webp = 0
    skipped_small = 0
    skipped_nonimage = 0
    errors = []

    for root, dirs, files in os.walk(SOURCE_DIR):
        for filename in files:
            filepath = os.path.join(root, filename)
            total_files += 1

            # 1. 檢查文件大小
            if os.path.getsize(filepath) <= SIZE_THRESHOLD:
                skipped_small += 1
                continue

            # 2. 檢查是否爲支持的圖片格式(擴展名初步過濾)
            ext = os.path.splitext(filename)[1].lower()
            if ext not in IMAGE_EXTS:
                skipped_nonimage += 1
                continue

            # 3. 真實格式檢測(優先檢測是否爲 WebP)
            try:
                real_format = Image.open(filepath).format
            except Exception:
                # 無法打開則跳過
                skipped_nonimage += 1
                continue

            # 如果已經是 WebP,跳過
            if real_format == 'WEBP':
                skipped_webp += 1
                continue

            # 4. 準備備份路徑(保留相對路徑)
            rel_path = os.path.relpath(filepath, SOURCE_DIR)
            backup_path = os.path.join(BACKUP_DIR, rel_path)
            os.makedirs(os.path.dirname(backup_path), exist_ok=True)

            # 5. 備份原文件(移動,而非複製,節省空間)
            try:
                shutil.move(filepath, backup_path)
            except Exception as e:
                errors.append(f"備份失敗 {rel_path}: {e}")
                continue

            # 6. 壓縮並保存到原位置(文件名不變)
            try:
                compress_to_webp(backup_path, filepath, QUALITY)
                processed += 1
                old_size = os.path.getsize(backup_path)
                new_size = os.path.getsize(filepath)
                print(f"✅ {rel_path}  {old_size//1024}KB → {new_size//1024}KB ({new_size/old_size*100:.1f}%)")
            except Exception as e:
                # 壓縮失敗,嘗試恢復原文件
                shutil.move(backup_path, filepath)
                errors.append(f"壓縮失敗 {rel_path}: {e}")
                continue

    # 統計報告
    print("\n" + "="*60)
    print(f"📊 處理完成!")
    print(f"  總文件數:{total_files}")
    print(f"  跳過(≤300KB):{skipped_small}")
    print(f"  跳過(已是WebP):{skipped_webp}")
    print(f"  跳過(非圖片):{skipped_nonimage}")
    print(f"  成功壓縮:{processed}")
    if errors:
        print(f"  錯誤數量:{len(errors)}")
        for err in errors:
            print(f"    ⚠️ {err}")
    print("="*60)

if __name__ == "__main__":
    main()

 

微信赞赏

微信

支付宝赞赏

支付寶

✍️ 作者: 紅穆

網站管理員 · 感謝閱讀,更多精彩內容敬請關注

作者主頁 查看主頁 →

相關文章

Import "requests" could not be resolved from source

Import "requests" could not be resolved from source 語言筆記 python

這個報錯是在使用Pylance這個Python語言服務器時出現的。其中,"Import "requests" could not be resolved from source"這個錯誤提示表示在你的代碼中引用了requests模塊,但是Pylance無法從源中找到該模塊的位置。可能的原因是你沒有安…
👁 1771
重新安装Python和requests库

重新安裝Python和requests庫 語言筆記 python

如果您遇到了 "Import "requests" could not be resolved from source" 的問題,可以嘗試重新安裝 Python 和 requests 庫。首先,您需要卸載當前的 Python 和 requests 庫。在 Windows 系統上,您可以通過在命令提示…
👁 439
WARNING: Skipping requests as it is not installed.

WARNING: Skipping requests as it is not installed. 語言筆記 python

這個錯誤提示說明你的Python環境中缺少requests庫,而你的代碼中又調用了這個庫,因此Python無法正常執行你的代碼。解決這個問題的方法是安裝requests庫。你可以在命令行中使用pip命令來安裝:pip install requests如果你使用的是Python3,可以使用pip3命令…
👁 2100
python报错,这是什么原因?AttributeError: partially initialized module 'openai' has no attribute 'Completion' (most likely due to a circular import)

python報錯,這是什麼原因?AttributeError: partially initialized module 'openai' has no attribute 'Completion' (most likely due to a circular import) 語言筆記 python

這個錯誤提示表明在導入 openai 模塊和特定的 Completion 屬性時出現了問題,很可能是由於循環導入導致的。出現這個錯誤的原因可能是你的代碼中存在兩個或多個模塊之間相互導入,形成了循環依賴。例如,模塊A導入了模塊B,而模塊B又導入了模塊A。循環導入會導致模塊在加載時無法正確地初始化,從而…
👁 656
python如何打包在Windows上运行?

python如何打包在Windows上運行? 語言筆記 python

在Windows上打包和運行Python程序的最常用方式是使用PyInstaller。PyInstaller是一個免費的、跨平臺的Python應用程序打包工具,可以將Python代碼和其依賴的庫打包成一個獨立的可執行文件,使得在沒有安裝Python解釋器的系統上運行Python程序成爲可能。以下是使…
👁 300
python开发用什么编程软件好?

python開發用什麼編程軟件好? 語言筆記 python

Python開發的編程軟件有很多,以下是一些常用的Python集成開發環境(IDE)和編輯器:PyCharmPyCharm是一個由JetBrains開發的集成開發環境,它專爲Python開發者設計。PyCharm功能強大,提供了代碼補全、調試、版本控制、代碼重構等一系列高級功能,可以幫助開發者提高工…
👁 175

推薦閱讀

php 如何开启报错?

php 如何開啓報錯? 踩坑總結

簡單高效的辦法。直接加入代碼。&lt;?php error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); ?&gt;只需在出錯的 PHP 文件最頂部添加以下代碼,僅對當前腳本…
👁 84
响应式品牌时尚女鞋网站模板 0476

響應式品牌時尚女鞋網站模板 0476 實用收藏 易優模板

此套eyoucms響應式模板適用於品牌時尚女鞋行業,設計風格時尚精緻,能夠展示女鞋產品、品牌形象、新品發佈及招商加盟。有助於女鞋品牌在線上吸引消費者與代理商,提升品牌知名度。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優…
👁 56
(自适应手机端)响应式驱动芯片网站pbootcms模板 电气设备类网站源码下载 0874

(自適應手機端)響應式驅動芯片網站pbootcms模板 電氣設備類網站源碼下載 0874 實用收藏 pbootcms模板

一款響應式驅動芯片與電氣設備類PbootCMS網站模板,支持PC與WAP端。設計風格科技精密,適合展示驅動芯片、電力電子器件等產品。有助於半導體或電氣企業在線上展示產品,吸引電子工程師與採購。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4…
👁 45
(PC+WAP)蓝色弹簧针厂家网站pbootcms模板 探针充电连接器网站源码下载 0110

(PC+WAP)藍色彈簧針廠家網站pbootcms模板 探針充電連接器網站源碼下載 0110 實用收藏 pbootcms模板

一款針對彈簧針、探針充電連接器生產廠家的PbootCMS網站模板,採用藍色風格,支持PC與WAP端。設計風格專業精密,適合展示電子連接器產品與核心技術。有助於精密電子元件企業在線上建立品牌形象,拓展電子行業客戶。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin …
👁 40
响应式建筑科技木屋定制网站模板 0889

響應式建築科技木屋定製網站模板 0889 實用收藏 易優模板

一款針對建築科技與木屋定製行業的eyoucms響應式網站模板。設計風格現代環保,能夠展示木屋產品、建築科技、定製服務及工程案例。有助於新型建築企業在線上展示綠色建築理念與實力。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易…
👁 42
营销型塑料板材净化环保设备网站模板 0092

營銷型塑料板材淨化環保設備網站模板 0092 實用收藏 易優模板

一款針對營銷型塑料板材與淨化環保設備企業的eyoucms網站模板。設計風格綠色環保,能夠展示塑料板材產品、淨化設備及技術方案。有助於環保材料企業在線上展示產品,吸引工業客戶。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優…
👁 42