Python进行图片压缩的六种方法全解

 更新时间:2026年06月22日 08:50:18   作者:detayun  
这篇文章详细介绍了Python中处理图片压缩的的方法,对比了Pillow、TinyPNG、WebP、PyVips、OpenCV和K-means等六种主流方案,帮助开发者根据具体需求选择合适的工具,需要的朋友可以参考下

图片占网页流量60%以上,一张10MB的照片能拖慢整个页面加载速度。Python生态里压缩图片的方法不少,但适合你的可能就两三种

这篇把主流方案捋一遍,告诉你什么场景用什么工具。

一、先分清两条路

类型原理压缩率信息损失典型场景
无损压缩消除数据冗余,解码后与原图完全一致10%-30%医学影像、PNG透明图、技术图纸
有损压缩丢弃人眼不敏感的高频细节50%-90%网页配图、社媒分享、缩略图

绝大多数场景,选有损就够了。 quality=85 时人眼几乎无法分辨,体积已砍掉60%。

二、六种主流方法

1. Pillow —— 最通用,首选

Python图像处理的标准库,装完就能用。

pip install Pillow

三种压缩手段

from PIL import Image

img = Image.open("photo.jpg")

# ① 降质量(最常用)
img.save("small.jpg", quality=85, optimize=True)

# ② 缩尺寸
img_resized = img.resize((1920, 1080), Image.LANCZOS)
img_resized.save("resized.jpg", quality=85)

# ③ 换格式(PNG → JPEG,体积常减50%+)
if img.mode == 'RGBA':
    img = img.convert('RGB')
img.save("converted.jpg", "JPEG", quality=85)
参数推荐值说明
quality85质量与体积的最佳平衡点
optimizeTrue额外尝试无损压缩JPEG
resampleLANCZOS高质量缩放算法

适合: 日常开发、批量处理、离线场景。

2. TinyPNG API —— 压缩率最高

不是Python库,但有官方Python SDK,一行调用:

pip install tinify
import tinify
tinify.key = "YOUR_API_KEY"

source = tinify.from_file("input.png")
source.to_file("output.png")  # 自动选最优参数
指标Pillow (quality=85)TinyPNG
PNG压缩率20%-30%50%-80%
JPG压缩率40%-60%50%-70%
免费额度无限制月500张

适合: 对压缩率要求极高、图片量不大的场景。

3. WebP格式转换 —— 谷歌出品,体积最小

WebP是目前综合压缩率最优的图片格式,同画质下比JPEG小25%-35%。

from PIL import Image

img = Image.open("photo.jpg")
img.save("photo.webp", "WEBP", quality=80)
对比项JPEGWebP
同质量体积100KB65-75KB
浏览器支持99%96%(IE不支持)
透明通道

适合: 现代化网站、不需要兼容IE的项目。

4. PyVips —— 性能怪兽,内存极低

Pillow的问题:大图(>50MB)会吃光内存。PyVips用流式处理,100MB图片只占几十MB内存。

pip install pyvips
import pyvips

img = pyvips.Image.thumbnail("huge.jpg", 1920)
img.write_to_file("small.jpg", Q=85)
指标PillowPyVips
100张10MB图耗时40秒,峰值内存2GB耗时8秒,峰值内存200MB
大图支持勉强轻松

适合: 批量处理大图、服务器端图片处理。

5. OpenCV —— 视频帧/实时流首选

如果你在处理视频帧或摄像头流,OpenCV比Pillow快得多。

import cv2

img = cv2.imread("photo.jpg")
cv2.imwrite("small.jpg", img, [cv2.IMWRITE_JPEG_QUALITY, 85])

适合: 视频处理、实时流、需要同时做图像分析的场景。

6. K-means聚类 —— 算法级压缩,可控色彩数

不改格式,直接减少图片色彩数量。原理:把相近颜色归为一类。

import numpy as np
from sklearn.cluster import KMeans
from PIL import Image

img = Image.open("photo.jpg")
pixels = np.array(img).reshape(-1, 3)

kmeans = KMeans(n_clusters=64)  # 只保留64种颜色
kmeans.fit(pixels)
new_pixels = kmeans.cluster_centers_[kmeans.labels_]

new_img = Image.fromarray(new_pixels.reshape(img.size[1], img.size[0], 3).astype('uint8'))
new_img.save("kmeans.jpg")
色彩数效果压缩率
256轻微色块感~40%
64明显海报化~60%
16强烈艺术感~75%

适合: 图标处理、艺术化效果、学习算法原理。

三、方法对比总表

方法压缩率速度内存难度最佳场景
Pillow⭐⭐⭐⭐⭐⭐⭐⭐通用首选
TinyPNG⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐追求极致压缩
WebP⭐⭐⭐⭐⭐⭐⭐⭐⭐现代Web项目
PyVips⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐大图批量处理
OpenCV⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐视频/实时流
K-means⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐艺术化/学习

四、怎么选?看这个决策树

需要压缩图片?
│
├─ 几张图,临时用 → 在线工具(tinypng.com),别写代码
│
├─ 批量 + 离线 → Pillow(本文方法1),够用
│
├─ 压缩率优先 → TinyPNG API
│
├─ 网站配图 → WebP格式
│
├─ 图片>50MB / 批量>1000张 → PyVips
│
├─ 视频帧处理 → OpenCV
│
└─ 玩算法 / 艺术化 → K-means

五、一个能直接用的批量脚本

把上面最常用的方案合在一起:

import os
from PIL import Image

def compress_batch(input_dir, output_dir, quality=85, max_width=1920):
    os.makedirs(output_dir, exist_ok=True)
    
    for f in os.listdir(input_dir):
        if not f.lower().endswith(('.jpg', '.jpeg', '.png', '.bmp')):
            continue
        
        in_path = os.path.join(input_dir, f)
        out_path = os.path.join(output_dir, f)
        
        with Image.open(in_path) as img:
            if img.mode in ('RGBA', 'P'):
                img = img.convert('RGB')
            
            if img.width > max_width:
                ratio = max_width / img.width
                img = img.resize((max_width, int(img.height * ratio)), Image.LANCZOS)
            
            img.save(out_path, 'JPEG', quality=quality, optimize=True)
            
            orig = os.path.getsize(in_path) / 1024
            new = os.path.getsize(out_path) / 1024
            print(f"{f}: {orig:.0f}KB → {new:.0f}KB ({1-new/orig:.0%})")

compress_batch("./原图", "./压缩", quality=85)

最后说一句

别追求"最好的压缩方法",够用的才是最好的。大多数情况下,Pillow + quality=85 + optimize=True,已经能解决90%的问题。

先把这一招用熟,再根据实际瓶颈考虑换工具。

以上就是Python进行图片压缩的六种方法全解的详细内容,更多关于Python图片压缩方法的资料请关注脚本之家其它相关文章!

相关文章

  • Python使用whisper实现语音识别(ASR)的示例代码

    Python使用whisper实现语音识别(ASR)的示例代码

    Whisper是OpenAI的一个强大的语音识别库,支持离线的语音识别,本文主要介绍了Python使用whisper实现语音识别(ASR)的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Python实现自动化对Word文档添加或移除行号

    Python实现自动化对Word文档添加或移除行号

    Word文档中的行号(行编号)功能是对于精细化的文档编辑以及解析非常有用的功能,添加行号能够极大地提升文档的可读性和定位效率,本文将介绍如何使用Python来实现自动化对Word文档添加或移除行号,为文档处理工作带来便捷,需要的朋友可以参考下
    2024-07-07
  • Python变量教程之全局变量和局部变量

    Python变量教程之全局变量和局部变量

    这篇文章主要介绍了Python变量教程之全局变量和局部变量,文章围绕主题展开详细的晌午内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Django开发中的日志输出的方法

    Django开发中的日志输出的方法

    这篇文章主要介绍了Django开发中的日志输出的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  •  Java SE 面向对象编程的3个常用接口

     Java SE 面向对象编程的3个常用接口

    这篇文章主要f Java SE 面向对象编程的3个常用接口,Comparable、Comparator 比较器、Cloneable,下面文章详细介绍,需要的小伙伴可以参考一下
    2022-01-01
  • Python报错:KeyError: ‘xxx‘的原因及解决方案

    Python报错:KeyError: ‘xxx‘的原因及解决方案

    在Python编程实践中,遇到KeyError是一种常见的异常,特别是在处理字典(dictionary)时,当尝试访问一个不存在于字典中的键时,Python会抛出KeyError,本文旨在深入探讨这一错误的背景、发生原因、解决方案,需要的朋友可以参考下
    2025-07-07
  • python flask服务端响应与重定向处理各种用法小结

    python flask服务端响应与重定向处理各种用法小结

    这篇文章主要介绍了python flask服务端响应与重定向处理各种用法小结,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • 对Xpath 获取子标签下所有文本的方法详解

    对Xpath 获取子标签下所有文本的方法详解

    今天小编就为大家分享一篇对Xpath 获取子标签下所有文本的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python 删除系统中的文件(按时间,大小,扩展名)

    python 删除系统中的文件(按时间,大小,扩展名)

    这篇文章主要介绍了python 如何删除系统中的文件,分别按时间,大小,扩展名删除,满足不同需求,感兴趣的朋友可以了解下
    2020-11-11
  • Python OpenCV利用笔记本摄像头实现人脸检测

    Python OpenCV利用笔记本摄像头实现人脸检测

    这篇文章主要为大家详细介绍了Python OpenCV利用笔记本摄像头实现人脸检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04

最新评论