Python實(shí)現(xiàn)圖片批量無(wú)損壓縮腳本
概述
隨著站點(diǎn)的內(nèi)容越來(lái)越多,圖片所占據(jù)項(xiàng)目的空間越來(lái)越大,需要開(kāi)始考慮到幽絡(luò)源圖像的壓縮了,本教程將會(huì)提供一個(gè)圖像的壓縮腳本來(lái)實(shí)現(xiàn)對(duì)png、jpg、jpeg、webp圖像的壓縮,另外試過(guò)自己壓縮圖像的用戶可能會(huì)特別注意png的壓縮,png是一種無(wú)損圖像,普通的pillow庫(kù)已不足以實(shí)現(xiàn)對(duì)png的壓縮,本教程所提供腳本同樣適用于png的壓縮。
壓縮腳本
import os import sys from PIL import Image import subprocess def compress_png_aggressively(input_path, quality): """直接覆蓋源文件的PNG壓縮方案""" try: # 1. 使用pngquant直接覆蓋源文件(添加--speed 1加快速度) subprocess.run([ "pngquant", "--force", "--speed", "1", # 加速處理 "--quality", f"{max(10, 100 - quality)}-100", "--output", input_path, # 直接輸出到原文件 "--", input_path ], check=True) # 2. 直接運(yùn)行optipng覆蓋原文件(添加-clobber覆蓋寫(xiě)入) subprocess.run([ "optipng", "-o5", "-quiet", "-clobber", # 允許覆蓋原文件 input_path ], check=True) except subprocess.CalledProcessError as e: print(f"壓縮失敗(已保留原文件): {e}") except Exception as e: print(f"未知錯(cuò)誤: {e}") def compress_image_by_quality(input_path, quality): """ 按質(zhì)量壓縮圖片并覆蓋原文件 :param input_path: 圖片路徑 :param quality: 壓縮質(zhì)量 (0-100) """ if not os.path.isfile(input_path): print(f"文件不存在: {input_path}") return file_ext = os.path.splitext(input_path)[1].lower() supported_formats = ['.jpg', '.jpeg', '.png', '.webp'] if file_ext not in supported_formats: print(f"不支持的圖片格式: {input_path}") return original_size = os.path.getsize(input_path) / 1024 # KB try: if file_ext in ['.jpg', '.jpeg']: img = Image.open(input_path) img.save(input_path, quality=quality, optimize=True, progressive=True) elif file_ext == '.png': # 對(duì)PNG使用強(qiáng)力壓縮 compress_png_aggressively(input_path, quality) elif file_ext == '.webp': img = Image.open(input_path) img.save(input_path, quality=quality, method=6) compressed_size = os.path.getsize(input_path) / 1024 print( f"壓縮完成: {os.path.basename(input_path)} 質(zhì)量: {quality} 大小: {original_size:.2f}KB -> {compressed_size:.2f}KB") except Exception as e: print(f"壓縮過(guò)程中出錯(cuò): {e}") def compress_images_in_directory(directory, quality): """ 壓縮目錄下的所有圖片 :param directory: 目錄路徑 :param quality: 壓縮質(zhì)量 (0-100) """ if not os.path.isdir(directory): print(f"目錄不存在: {directory}") return print(f"開(kāi)始?jí)嚎s目錄: {directory},質(zhì)量設(shè)置: {quality}") for filename in os.listdir(directory): filepath = os.path.join(directory, filename) if os.path.isfile(filepath): compress_image_by_quality(filepath, quality) print("所有圖片壓縮完成") if __name__ == "__main__": # 檢查必要工具是否安裝 try: subprocess.run(["pngquant", "--version"], check=True, stdout=subprocess.PIPE) subprocess.run(["optipng", "--version"], check=True, stdout=subprocess.PIPE) except: print("警告: 請(qǐng)先安裝pngquant和optipng以獲得最佳PNG壓縮效果") print("Ubuntu/Debian: sudo apt-get install pngquant optipng") print("CentOS/RHEL: sudo yum install pngquant optipng") print("MacOS: brew install pngquant optipng") sys.exit(1) # 工具未安裝時(shí)直接退出 directory = r"/www/wwwroot/www.youluoyuan.com/wp-content/uploads/2025/01" #含有圖片的目錄 try: quality = 60 #壓縮質(zhì)量 范圍1~100,建議50~75,數(shù)字越小則壓縮越強(qiáng),但圖片質(zhì)量會(huì)更低 if not 0 <= quality <= 100: raise ValueError except ValueError: print("錯(cuò)誤: 質(zhì)量參數(shù)必須是0到100之間的整數(shù)") sys.exit(1) try: compress_images_in_directory(directory, quality) print("\n? 已全部壓縮完成") # 新增完成提示 sys.exit(0) # 正常退出 except Exception as e: print(f"\n? 壓縮過(guò)程中發(fā)生嚴(yán)重錯(cuò)誤: {e}") sys.exit(1) # 異常退出
腳本解釋
在上面的腳本中
directory是指包含圖片的目錄,windows與linux系統(tǒng)都可以
quality表示期望壓縮的質(zhì)量,范圍1~100,建議50~75,數(shù)字越小則壓縮越強(qiáng),但圖片質(zhì)量會(huì)更低
腳本使用
安裝必備庫(kù)
對(duì)于linux系統(tǒng),執(zhí)行如下對(duì)應(yīng)命令即可安裝pngquant、optipng庫(kù),這兩個(gè)庫(kù)主要是特定針對(duì)png的壓縮
# Ubuntu/Debian sudo apt-get install pngquant optipng # CentOS/RHEL sudo yum install pngquant optipng # MacOS brew install pngquant optipng
對(duì)于windows系統(tǒng),方式之一是手動(dòng)下載pngquant、optipng并配置環(huán)境變量,幽絡(luò)源這里已提供適用于windows的pngquant、optipng庫(kù)
按照如圖快捷進(jìn)入環(huán)境變量配置
再將optipng和pngquant配置到path中去,如圖
配置保存后,在cmd命令中輸入如下兩條命令
pngquant --version optipng -version
若成功則能獲取到相應(yīng)的版本信息,如圖
使用腳本
以如下包含圖片的目錄為例,現(xiàn)在大小如下為104MB
再修改腳本中指定的目錄和期望的壓縮質(zhì)量,如圖
執(zhí)行后,開(kāi)始自動(dòng)批量壓縮,輸出如下
查看結(jié)果
壓縮后結(jié)果如下,并且圖像的實(shí)際質(zhì)量也不低,能夠極大的減少圖像占據(jù)磁盤(pán)空間。
到此這篇關(guān)于Python實(shí)現(xiàn)圖片批量無(wú)損壓縮腳本的文章就介紹到這了,更多相關(guān)Python圖片壓縮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python判斷是否json是否包含一個(gè)key的方法
今天小編就為大家分享一篇Python判斷是否json是否包含一個(gè)key的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python實(shí)現(xiàn)聊天機(jī)器人的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)聊天機(jī)器人,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07python爬蟲(chóng)獲取京東手機(jī)圖片的圖文教程
下面小編就為大家分享一篇python爬蟲(chóng)獲取京東手機(jī)圖片的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Python+OpenCV 實(shí)現(xiàn)圖片無(wú)損旋轉(zhuǎn)90°且無(wú)黑邊
今天小編就為大家分享一篇Python+OpenCV 實(shí)現(xiàn)圖片無(wú)損旋轉(zhuǎn)90°且無(wú)黑邊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12python Matplotlib底圖中鼠標(biāo)滑過(guò)顯示隱藏內(nèi)容的實(shí)例代碼
這篇文章主要介紹了python Matplotlib底圖中鼠標(biāo)滑過(guò)顯示隱藏內(nèi)容,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Jupyter Notebook運(yùn)行Python代碼實(shí)現(xiàn)傳參方式
這篇文章主要介紹了Jupyter Notebook運(yùn)行Python代碼實(shí)現(xiàn)傳參方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07PyQt5結(jié)合QtDesigner實(shí)現(xiàn)文本框讀寫(xiě)操作
本文將結(jié)合實(shí)例代碼,介紹PyQt5結(jié)合QtDesigner實(shí)現(xiàn)文本框讀寫(xiě)操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06Pytorch Dataset,TensorDataset,Dataloader,Sampler關(guān)系解讀
這篇文章主要介紹了Pytorch Dataset,TensorDataset,Dataloader,Sampler關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09windows下安裝Python的XlsxWriter模塊方法
今天小編就為大家分享一篇windows下安裝Python的XlsxWriter模塊方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05