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

Python實現(xiàn)批量壓縮圖片的實用腳本分享

 更新時間:2026年02月02日 10:05:15   作者:傻啦嘿喲  
手機(jī)拍攝的4K照片動輒10MB,單反相機(jī)拍攝的RAW格式圖片更是高達(dá)50MB以上,龐大的圖片體積會帶來諸多困擾,通過Python腳本實現(xiàn)自動化壓縮,不僅能精準(zhǔn)控制壓縮參數(shù),還能批量處理成百上千張圖片,本文將通過實際案例,展示如何用50行代碼構(gòu)建高效圖片壓縮工具

引言:為什么需要批量壓縮圖片?

手機(jī)拍攝的4K照片動輒10MB,單反相機(jī)拍攝的RAW格式圖片更是高達(dá)50MB以上。當(dāng)需要分享旅行照片、上傳電商產(chǎn)品圖或管理設(shè)計素材庫時,龐大的圖片體積會帶來諸多困擾:云存儲空間快速耗盡、網(wǎng)頁加載速度變慢、郵件發(fā)送附件受限……批量壓縮圖片成為解決這些問題的關(guān)鍵手段。

通過Python腳本實現(xiàn)自動化壓縮,不僅能精準(zhǔn)控制壓縮參數(shù),還能批量處理成百上千張圖片。相比在線工具,本地腳本無需上傳隱私圖片,處理速度更快;相比專業(yè)軟件,Python方案無需付費且可高度定制。本文將通過實際案例,展示如何用50行代碼構(gòu)建高效圖片壓縮工具。

一、核心原理:如何實現(xiàn)圖片壓縮?

圖片壓縮主要通過兩種技術(shù)路徑實現(xiàn),Python的Pillow庫完美支持這兩種方式:

1. 尺寸壓縮:降低分辨率

原始圖片尺寸為4000×3000像素,若目標(biāo)設(shè)備僅需1920×1080顯示,直接縮小尺寸可減少75%像素量。Pillow的thumbnail()方法能自動保持寬高比進(jìn)行縮放:

from PIL import Image
img = Image.open("photo.jpg")
img.thumbnail((1920, 1080))  # 保持比例縮放

2. 質(zhì)量壓縮:優(yōu)化編碼

JPEG格式通過調(diào)整質(zhì)量參數(shù)(1-100)控制壓縮強(qiáng)度。質(zhì)量值越低,文件越小但可能產(chǎn)生噪點。實測顯示,質(zhì)量85時人眼難以察覺差異,但文件體積可減少60%:

img.save("compressed.jpg", quality=85, optimize=True)

3. 智能組合策略

最佳實踐是同時應(yīng)用尺寸和質(zhì)量壓縮。例如將4000×3000圖片縮小至1920×1440后,再設(shè)置質(zhì)量85,實測5.2MB原圖可壓縮至320KB,體積減少94%而肉眼幾乎無差別。

二、基礎(chǔ)腳本:50行代碼實現(xiàn)批量壓縮

以下腳本支持遞歸處理子目錄,自動創(chuàng)建輸出文件夾,并顯示壓縮進(jìn)度:

import os
from PIL import Image
from pathlib import Path

def compress_image(input_path, output_path, max_size=1920, quality=85):
    """壓縮單張圖片"""
    try:
        with Image.open(input_path) as img:
            # 轉(zhuǎn)換模式處理透明通道
            if img.mode in ("RGBA", "P"):
                img = img.convert("RGB")
            
            # 按比例縮放
            img.thumbnail((max_size, max_size), Image.LANCZOS)
            
            # 保存為JPEG格式
            output_path = output_path.with_suffix('.jpg')
            img.save(output_path, "JPEG", optimize=True, quality=quality)
            
            # 計算壓縮率
            orig_size = os.path.getsize(input_path)
            new_size = os.path.getsize(output_path)
            ratio = (1 - new_size / orig_size) * 100
            print(f"? {Path(input_path).name}: {orig_size//1024}KB → {new_size//1024}KB (節(jié)省{ratio:.1f}%)")
            
    except Exception as e:
        print(f"? 壓縮失敗 {input_path}: {e}")

def batch_compress(input_folder, output_folder, max_size=1920, quality=85):
    """批量處理文件夾"""
    input_path = Path(input_folder)
    output_path = Path(output_folder)
    output_path.mkdir(parents=True, exist_ok=True)

    # 支持的圖片格式
    supported_ext = ('.jpg', '.jpeg', '.png', '.bmp', '.tiff')
    
    # 遍歷所有圖片文件
    image_files = [
        f for f in input_path.rglob('*') 
        if f.suffix.lower() in supported_ext and f.is_file()
    ]

    if not image_files:
        print("?? 指定文件夾中沒有可處理的圖片")
        return

    print(f"?? 找到 {len(image_files)} 張圖片,開始壓縮...")
    for img_file in image_files:
        rel_path = img_file.relative_to(input_path)
        out_file = output_path / rel_path.with_stem(f"{rel_path.stem}_compressed")
        compress_image(img_file, out_file, max_size, quality)

    print(f"\n?? 全部完成!壓縮后圖片保存在: {output_folder}")

if __name__ == "__main__":
    batch_compress("./photos", "./compressed", max_size=1200, quality=75)

腳本特性說明:

  1. 智能路徑處理:使用Path.rglob()遞歸查找所有子目錄中的圖片
  2. 透明通道處理:自動將PNG的RGBA模式轉(zhuǎn)換為RGB,避免JPEG保存錯誤
  3. 進(jìn)度可視化:實時顯示每張圖片的壓縮前后大小及節(jié)省比例
  4. 安全設(shè)計:輸出路徑自動創(chuàng)建,避免因目錄不存在導(dǎo)致的錯誤

三、進(jìn)階優(yōu)化:滿足不同場景需求

1. 動態(tài)質(zhì)量調(diào)整(SSIM算法)

對于需要極致壓縮的場景,可通過結(jié)構(gòu)相似性(SSIM)評估圖片質(zhì)量損失,動態(tài)調(diào)整壓縮參數(shù):

from math import log
from SSIM_PIL import compare_ssim  # 需安裝pyssim庫

def get_ssim_at_quality(photo, quality):
    """計算指定質(zhì)量下的SSIM值"""
    temp_path = "temp.jpg"
    photo.save(temp_path, format="JPEG", quality=quality, progressive=True)
    ssim_score = compare_ssim(photo, Image.open(temp_path))
    os.remove(temp_path)
    return ssim_score

def find_optimal_quality(original_photo, target_ssim=0.95):
    """二分法尋找最優(yōu)質(zhì)量參數(shù)"""
    low, high = 70, 95
    while high - low > 2:
        mid = (high + low) // 2
        if get_ssim_at_quality(original_photo, mid) < target_ssim:
            low = mid
        else:
            high = mid
    return high

# 使用示例
img = Image.open("photo.jpg")
optimal_quality = find_optimal_quality(img)
img.save("optimized.jpg", quality=optimal_quality)

2. 格式轉(zhuǎn)換優(yōu)化

對于截圖、圖標(biāo)等簡單圖形,轉(zhuǎn)換為PNG格式并啟用調(diào)色板優(yōu)化可獲得更好效果:

def compress_png(input_path, output_path, palette_size=256):
    """PNG無損壓縮"""
    img = Image.open(input_path)
    if img.mode == "RGB":
        # 生成最優(yōu)調(diào)色板
        palleted_img = img.convert(
            'P', 
            palette=Image.ADAPTIVE, 
            colors=palette_size
        )
        palleted_img.save(
            output_path, 
            optimize=True,
            compress_level=9  # 最大壓縮級別
        )

3. 多線程加速處理

處理大量圖片時,使用多線程可顯著提升速度:

from concurrent.futures import ThreadPoolExecutor

def parallel_compress(input_folder, output_folder, max_workers=4):
    """多線程壓縮"""
    image_files = [f for f in Path(input_folder).rglob('*') 
                  if f.suffix.lower() in ('.jpg', '.png') and f.is_file()]
    
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        for img_file in image_files:
            rel_path = img_file.relative_to(input_folder)
            out_file = Path(output_folder) / rel_path.with_stem(f"{rel_path.stem}_compressed")
            executor.submit(
                compress_image, 
                img_file, 
                out_file, 
                max_size=1200, 
                quality=75
            )

四、實戰(zhàn)案例:電商圖片處理流程

某電商團(tuán)隊需要處理5000張產(chǎn)品圖,要求:

  1. 統(tǒng)一尺寸為800×800像素
  2. JPEG質(zhì)量設(shè)置為80
  3. 保留原始文件名并添加"_web"后綴
  4. 生成處理報告

解決方案:

import pandas as pd
from datetime import datetime

def ecommerce_compress(input_folder, output_folder):
    """電商圖片專用壓縮流程"""
    results = []
    start_time = datetime.now()
    
    for img_file in Path(input_folder).rglob('*.jpg'):
        try:
            # 創(chuàng)建輸出路徑
            rel_path = img_file.relative_to(input_folder)
            out_file = Path(output_folder) / rel_path.with_stem(f"{rel_path.stem}_web")
            out_file.parent.mkdir(parents=True, exist_ok=True)
            
            # 壓縮處理
            with Image.open(img_file) as img:
                # 強(qiáng)制正方形裁剪(需先安裝opencv-python)
                # import cv2
                # img = cv2.resize(np.array(img), (800,800))
                # img = Image.fromarray(img)
                
                # 簡單縮放方案
                img.thumbnail((800, 800), Image.LANCZOS)
                img.save(out_file, "JPEG", quality=80, optimize=True)
            
            # 記錄結(jié)果
            results.append({
                "文件名": img_file.name,
                "原始大小(KB)": os.path.getsize(img_file)//1024,
                "壓縮后(KB)": os.path.getsize(out_file)//1024,
                "狀態(tài)": "成功"
            })
            
        except Exception as e:
            results.append({
                "文件名": img_file.name,
                "原始大小(KB)": "-",
                "壓縮后(KB)": "-",
                "狀態(tài)": f"失敗: {str(e)}"
            })
    
    # 生成報告
    df = pd.DataFrame(results)
    report_path = Path(output_folder) / f"壓縮報告_{datetime.now().strftime('%Y%m%d')}.csv"
    df.to_csv(report_path, index=False)
    
    print(f"\n處理完成!耗時: {(datetime.now()-start_time).seconds}秒")
    print(f"詳細(xì)報告已生成: {report_path}")

# 使用示例
ecommerce_compress("./raw_images", "./web_images")

五、常見問題解決方案

1. 處理透明背景圖片

錯誤做法:直接保存為JPEG會丟失透明通道
正確方案:

def handle_transparency(input_path, output_path):
    img = Image.open(input_path)
    if img.mode == "RGBA":
        # 創(chuàng)建白色背景
        background = Image.new("RGB", img.size, (255, 255, 255))
        background.paste(img, mask=img.split()[-1])
        background.save(output_path, "JPEG", quality=85)
    else:
        img.save(output_path, "JPEG", quality=85)

2. 保留EXIF信息

使用piexif庫可保留照片的拍攝參數(shù):

import piexif

def save_with_exif(img, output_path, quality=85):
    """保存圖片并保留EXIF信息"""
    exif_dict = piexif.load(img.info['exif']) if 'exif' in img.info else {}
    img.save(
        output_path, 
        "JPEG", 
        quality=quality,
        exif=piexif.dump(exif_dict)
    )

3. 處理超大圖片

對于超過100MB的TIFF格式圖片,需先分塊處理:

from PIL import ImageSequence

def process_large_tiff(input_path, output_path):
    """分塊處理超大TIFF文件"""
    with Image.open(input_path) as img:
        for i, page in enumerate(ImageSequence.Iterator(img)):
            page.thumbnail((4000, 4000))  # 先縮小尺寸
            page.save(
                f"{output_path}_page{i}.jpg",
                "JPEG",
                quality=80,
                optimize=True
            )

六、性能對比:不同壓縮方案效率

方案處理速度壓縮率質(zhì)量損失適用場景
單純尺寸壓縮★★★★★網(wǎng)頁顯示
質(zhì)量85壓縮★★★★輕微電商產(chǎn)品圖
SSIM動態(tài)質(zhì)量調(diào)整★★★極高極小高端攝影作品
PNG調(diào)色板優(yōu)化★★簡單圖形/圖標(biāo)
多線程處理★★★★★同單線程批量處理

實測數(shù)據(jù)顯示:5000張圖片處理時,單線程需2小時,8線程方案僅需25分鐘。

七、總結(jié):構(gòu)建個性化圖片處理流水線

通過組合本文介紹的技術(shù)模塊,可構(gòu)建滿足不同需求的圖片處理系統(tǒng):

  1. 基礎(chǔ)版:尺寸+質(zhì)量壓縮(適合大多數(shù)場景)
  2. 電商版:正方形裁剪+水印添加+EXIF保留
  3. 攝影版:SSIM動態(tài)質(zhì)量+漸進(jìn)式JPEG
  4. 極速版:多線程處理+緩存機(jī)制

建議從基礎(chǔ)腳本開始,根據(jù)實際需求逐步添加功能模塊。對于非技術(shù)用戶,可使用PyInstaller將腳本打包為EXE文件,無需安裝Python環(huán)境即可運行。

圖片壓縮的本質(zhì)是在文件體積與視覺質(zhì)量間尋找平衡點。掌握這些技術(shù)后,您不僅能節(jié)省存儲空間,更能為網(wǎng)站加速、移動應(yīng)用優(yōu)化等場景提供關(guān)鍵支持。

以上就是Python批量壓縮圖片的實用腳本分享的詳細(xì)內(nèi)容,更多關(guān)于Python批量壓縮圖片的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Nginx簡介_動力節(jié)點Java學(xué)院整理

    Nginx簡介_動力節(jié)點Java學(xué)院整理

    Nginx是一個跨平臺的Web服務(wù)器,可運行在Linux、FreeBSD、Solaris、AIX、Mac OS、Windows等操作系統(tǒng)上,并且它還可以使用當(dāng)前操作系統(tǒng)特有的一些高效API來提高自己的性能
    2017-08-08
  • nginx和lvs各自的優(yōu)劣以及適合的使用環(huán)境

    nginx和lvs各自的優(yōu)劣以及適合的使用環(huán)境

    這篇文章主要介紹了nginx和lvs各自的優(yōu)劣以及適合的使用環(huán)境,幫助大家選擇符合需求的服務(wù)器,感興趣的朋友可以了解下
    2020-10-10
  • nginx 負(fù)載均衡配置及如何解決重復(fù)登錄問題

    nginx 負(fù)載均衡配置及如何解決重復(fù)登錄問題

    文章詳解Nginx源碼安裝與Docker部署,介紹四層/七層代理區(qū)別及負(fù)載均衡策略,通過ip_hash解決重復(fù)登錄問題,對nginx 負(fù)載均衡配置及如何解決重復(fù)登錄問題感興趣的朋友一起看看吧
    2025-07-07
  • nginx 某些url只能由特定網(wǎng)段訪問

    nginx 某些url只能由特定網(wǎng)段訪問

    在一些場景中,我們需要根據(jù)客戶端的IP地址或網(wǎng)段對訪問進(jìn)行控制,在Nginx中針對某些URL只允許特定網(wǎng)段訪問,本文就來介紹一下如何實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Nginx解決轉(zhuǎn)發(fā)地址時跨域的問題

    Nginx解決轉(zhuǎn)發(fā)地址時跨域的問題

    這篇文章主要介紹了Nginx實現(xiàn)轉(zhuǎn)發(fā)地址解決跨域問題的方法,文中介紹的很詳細(xì),對大家的學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • nginx反向代理配置去除前綴

    nginx反向代理配置去除前綴

    這篇文章主要介紹了nginx反向代理配置去除前綴的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Nginx服務(wù)器的SSL證書配置以及對SSL的反向代理配置

    Nginx服務(wù)器的SSL證書配置以及對SSL的反向代理配置

    這篇文章主要介紹了Nginx服務(wù)器的SSL證書配置以及對SSL的反向代理配置方法,通常在開啟全站HTTPS時會用到,需要的朋友可以參考下
    2016-01-01
  • Nginx配置同時支持http和https的兩種方式

    Nginx配置同時支持http和https的兩種方式

    現(xiàn)在的網(wǎng)站支持Https幾乎是標(biāo)配功能,Nginx能很好的支持Https功能,本文主要介紹了Nginx配置同時支持http和https的兩種方式,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • nginx-rtmp-module構(gòu)建流媒體直播服務(wù)器實戰(zhàn)指南

    nginx-rtmp-module構(gòu)建流媒體直播服務(wù)器實戰(zhàn)指南

    本文主要介紹了nginx-rtmp-module構(gòu)建流媒體直播服務(wù)器實戰(zhàn)指南,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Nginx中的文件下載服務(wù)器詳解

    Nginx中的文件下載服務(wù)器詳解

    利 用Nginx的諸多內(nèi)置指令可實現(xiàn)自動生成下載文件列表 頁、限制下載帶寬等功能,這篇文章給大家介紹Nginx中的文件下載服務(wù)器功能,感興趣的朋友一起看看吧
    2024-06-06

最新評論

清水河县| 夹江县| 阳朔县| 个旧市| 榆社县| 太湖县| 梓潼县| 丽江市| 读书| 分宜县| 渭源县| 南京市| 莆田市| 阿坝县| 阳原县| 溧水县| 华坪县| 西盟| 石嘴山市| 东至县| 任丘市| 巴中市| 五常市| 左云县| 麻城市| 聂荣县| 连州市| 故城县| 吉隆县| 修水县| 公主岭市| 邻水| 奇台县| 凭祥市| 龙胜| 上思县| 海盐县| 文安县| 东丰县| 北票市| 凤山县|