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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. 智能組合策略

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

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

以下腳本支持遞歸處理子目錄,自動(dòng)創(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)
            
            # 計(jì)算壓縮率
            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("?? 指定文件夾中沒(méi)有可處理的圖片")
        return

    print(f"?? 找到 {len(image_files)} 張圖片,開(kāi)始?jí)嚎s...")
    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)

腳本特性說(shuō)明:

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

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

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

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

from math import log
from SSIM_PIL import compare_ssim  # 需安裝pyssim庫(kù)

def get_ssim_at_quality(photo, quality):
    """計(jì)算指定質(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)化

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

def compress_png(input_path, output_path, palette_size=256):
    """PNG無(wú)損壓縮"""
    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  # 最大壓縮級(jí)別
        )

3. 多線程加速處理

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

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
            )

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

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

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

解決方案:

import pandas as pd
from datetime import datetime

def ecommerce_compress(input_folder, output_folder):
    """電商圖片專(zhuān)用壓縮流程"""
    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)
                
                # 簡(jiǎn)單縮放方案
                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)}"
            })
    
    # 生成報(bào)告
    df = pd.DataFrame(results)
    report_path = Path(output_folder) / f"壓縮報(bào)告_{datetime.now().strftime('%Y%m%d')}.csv"
    df.to_csv(report_path, index=False)
    
    print(f"\n處理完成!耗時(shí): {(datetime.now()-start_time).seconds}秒")
    print(f"詳細(xì)報(bào)告已生成: {report_path}")

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

五、常見(jiàn)問(wèn)題解決方案

1. 處理透明背景圖片

錯(cuò)誤做法:直接保存為JPEG會(huì)丟失透明通道
正確方案:

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庫(kù)可保留照片的拍攝參數(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. 處理超大圖片

對(duì)于超過(guò)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
            )

六、性能對(duì)比:不同壓縮方案效率

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

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

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

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

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

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

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

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

相關(guān)文章

  • Nginx簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Nginx簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Nginx是一個(gè)跨平臺(tái)的Web服務(wù)器,可運(yùn)行在Linux、FreeBSD、Solaris、AIX、Mac OS、Windows等操作系統(tǒng)上,并且它還可以使用當(dāng)前操作系統(tǒng)特有的一些高效API來(lái)提高自己的性能
    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ù)登錄問(wèn)題

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

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

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

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

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

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

    nginx反向代理配置去除前綴

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

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

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

    Nginx配置同時(shí)支持http和https的兩種方式

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

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

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

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

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

最新評(píng)論

新泰市| 沧州市| 双鸭山市| 信丰县| 丹棱县| 治县。| 呼和浩特市| 抚远县| 阿克陶县| 长沙县| 韶山市| 鸡泽县| 肇庆市| 乌拉特前旗| 客服| 赤峰市| 庐江县| 奎屯市| 伊金霍洛旗| 大连市| 垣曲县| 盱眙县| 三明市| 延川县| 河源市| 和政县| 定西市| 临夏县| 绥芬河市| 沿河| 交口县| 胶州市| 广昌县| 霍州市| 米脂县| 榆树市| 镇平县| 余姚市| 丹棱县| 青铜峡市| 泾阳县|