從入門到實戰(zhàn)詳解Python壓縮圖片的完整方法
圖片太大,上傳慢、存儲貴、加載卡?用 Python 幾行代碼就能搞定。
為什么要壓縮圖片
- 網(wǎng)站加速:圖片占網(wǎng)頁流量的 60%+,壓縮后加載速度提升明顯
- 節(jié)省存儲:一張 10MB 的照片壓到 500KB,硬盤壓力小很多
- 符合平臺限制:微信、微博、電商平臺都有圖片大小上限
方案一:Pillow(最推薦,簡單夠用)
Pillow 是 Python 最主流的圖像處理庫,壓縮圖片只需幾行代碼。
1. 按質量壓縮(有損)
from PIL import Image
def compress_image(input_path, output_path, quality=85):
"""
quality: 1-100,越小文件越小,畫質越差
推薦值:70-85 之間性價比最高
"""
img = Image.open(input_path)
# JPEG 不支持透明通道,需要轉換模式
if img.mode in ('RGBA', 'P'):
img = img.convert('RGB')
img.save(output_path, 'JPEG', optimize=True, quality=quality)
original_size = os.path.getsize(input_path) / 1024
new_size = os.path.getsize(output_path) / 1024
print(f"原大小: {original_size:.1f}KB → 壓縮后: {new_size:.1f}KB,節(jié)省 {100 - new_size/original_size*100:.1f}%")
compress_image("photo.jpg", "photo_compressed.jpg", quality=80)
2. 按尺寸壓縮(縮小分辨率)
def resize_image(input_path, output_path, max_width=1200):
img = Image.open(input_path)
w, h = img.size
if w > max_width:
ratio = max_width / w
new_size = (max_width, int(h * ratio))
img = img.resize(new_size, Image.LANCZOS) # LANCZOS 是高質量縮放算法
img.save(output_path, 'JPEG', optimize=True, quality=85)
3. 批量壓縮整個文件夾
import os
from PIL import Image
def batch_compress(input_dir, output_dir, quality=80):
os.makedirs(output_dir, exist_ok=True)
for filename in os.listdir(input_dir):
if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.webp')):
input_path = os.path.join(input_dir, filename)
output_path = os.path.join(output_dir, filename)
img = Image.open(input_path)
if img.mode in ('RGBA', 'P'):
img = img.convert('RGB')
img.save(output_path, 'JPEG', optimize=True, quality=quality)
print(f"? {filename}")
batch_compress("./photos", "./photos_compressed", quality=75)
方案二:OpenCV(適合需要更多控制的場景)
import cv2
def compress_with_cv2(input_path, output_path, quality=80):
img = cv2.imread(input_path)
# quality 參數(shù)范圍 0-100
cv2.imwrite(output_path, img, [cv2.IMWRITE_JPEG_QUALITY, quality])
OpenCV 優(yōu)勢是可以順便做裁剪、旋轉、加水印等操作,再一起壓縮。
方案三:tinify(API 壓縮,效果最好)
如果追求極致壓縮比,可以用 tinify 的 API,它用的是有損+無損混合算法。
import tinify
tinify.key = "你的API_KEY"
source = tinify.from_file("photo.jpg")
source.to_file("photo_tiny.jpg")
免費額度每月 500 張,超出后付費,但壓縮效果確實比 Pillow 好 20%-40%。
幾個實用技巧
| 技巧 | 說明 |
|---|---|
| quality=85 是 sweet spot | 低于 70 肉眼可見模糊,高于 90 壓縮效果很弱 |
| 先縮尺寸再壓質量 | 效果翻倍,比如先 resize 到 1200px 寬,再 quality=80 |
| PNG 轉 JPEG | 如果不需要透明通道,PNG 轉 JPEG 體積能縮小 70%+ |
| 用 WebP 格式 | 同等畫質下比 JPEG 小 30%,現(xiàn)代瀏覽器全支持 |
| optimize=True 別忘加 | Pillow 的這個參數(shù)會額外做一次無損優(yōu)化,白撿的壓縮 |
到底選哪個?
| 需求 | 推薦方案 |
|---|---|
| 快速搞定、批量處理 | Pillow |
| 要同時做圖像處理(裁剪/旋轉) | OpenCV |
| 追求最小體積、不差錢 | tinify API |
| 面向 Web 前端輸出 | 轉為 WebP 格式 |
完整實戰(zhàn)腳本(直接復制就能用)
import os
from PIL import Image
def smart_compress(input_path, output_path, max_width=1920, quality=80):
img = Image.open(input_path)
# 1. 轉換模式
if img.mode in ('RGBA', 'P'):
img = img.convert('RGB')
# 2. 縮小尺寸
w, h = img.size
if w > max_width:
ratio = max_width / w
img = img.resize((max_width, int(h * ratio)), Image.LANCZOS)
# 3. 壓縮保存
img.save(output_path, 'JPEG', optimize=True, quality=quality)
original = os.path.getsize(input_path) / 1024
compressed = os.path.getsize(output_path) / 1024
print(f"{os.path.basename(input_path)}: {original:.0f}KB → {compressed:.0f}KB")
# 使用
smart_compress("large_photo.jpg", "small_photo.jpg")
圖片壓縮的核心就一句話:先縮尺寸,再調質量,能轉格式就轉格式。掌握這三步,90% 的場景都夠用了。
到此這篇關于從入門到實戰(zhàn)詳解Python壓縮圖片的完整方法的文章就介紹到這了,更多相關Python壓縮圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Flask之pipenv虛擬環(huán)境的實現(xiàn)
這篇文章主要介紹了Flask之pipenv虛擬環(huán)境的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
python中不規(guī)則字符串模糊匹配(fuzzywuzzy)
本文主要介紹了python中不規(guī)則字符串模糊匹配(fuzzywuzzy),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-08-08
Python實現(xiàn)將中文大寫金額轉數(shù)字金額
在日常的財務處理、票據(jù)識別或金融系統(tǒng)開發(fā)中,我們常常需要將中文大寫的金額轉換為阿拉伯數(shù)字形式,下面我們就來看看如何使用Python實現(xiàn)這一需求吧2025-09-09
以windows service方式運行Python程序的方法
這篇文章主要介紹了以windows service方式運行Python程序的方法,可實現(xiàn)將Python程序變成windows服務的功能,需要的朋友可以參考下2015-06-06

