当前位置: 首页
编程语言
Python图片压缩从入门到实战的完整方法详解

Python图片压缩从入门到实战的完整方法详解

时间:2026-08-14
转载

Python压缩图片可用Pillow按质量或尺寸压缩、批量处理;OpenCV适合结合图像操作;tinifyAPI压缩比最高但需付费。核心步骤为先缩尺寸、再调质量、能转格式则转格式。该流程通用,适用于各种开发场景,如Web、移动端,推荐注意优化。

图片太大,上传慢、存储贵、加载卡?用 Python 几行代码就能搞定。

从入门到实战详解Python压缩图片的完整方法

为什么要压缩图片

  • 网站加速:图片占网页流量的 60%+,压缩后加载速度提升明显
  • 节省存储:一张 10MB 的照片压到 500KB,硬盘压力小很多
  • 符合平台限制:微信、微博、电商平台都有图片大小上限

方案一:Pillow(最推荐,简单够用)

说到图片压缩,Pillow 绝对是 Python 生态里的首选。它足够简单,也足够强大,几行代码就能搞定,日常开发中 80% 的需求都能覆盖。

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.sa ve(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,节省 {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.sa ve(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.sa ve(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 参数范围 0-100
    cv2.imwrite(output_path, img, [cv2.IMWRITE_JPEG_QUALITY, quality])

OpenCV 的优势在于,它不只是压缩工具,更是一个完整的图像处理工具箱。如果你需要顺便做裁剪、旋转、加水印等操作,再一起压缩,它比 Pillow 更顺手。

方案三:tinify(API 压缩,效果最好)

如果追求极致压缩比,tinify 的 API 是不二之选。它采用有损+无损混合算法,压缩效果确实比 Pillow 好 20%-40%。

import tinify

tinify.key = "你的API_KEY"
source = tinify.from_file("photo.jpg")
source.to_file("photo_tiny.jpg")

免费额度每月 500 张,超出后付费。对于小团队或偶尔使用来说,这个额度完全够用。

几个实用技巧

技巧说明
quality=85 是 sweet spot低于 70 肉眼可见模糊,高于 90 压缩效果很弱
先缩尺寸再压质量效果翻倍,比如先 resize 到 1200px 宽,再 quality=80
PNG 转 JPEG如果不需要透明通道,PNG 转 JPEG 体积能缩小 70%+
用 WebP 格式同等画质下比 JPEG 小 30%,现代浏览器全支持
optimize=True 别忘加Pillow 的这个参数会额外做一次无损优化,白捡的压缩

到底选哪个?

需求推荐方案
快速搞定、批量处理Pillow
要同时做图像处理(裁剪/旋转)OpenCV
追求最小体积、不差钱tinify API
面向 Web 前端输出转为 WebP 格式

完整实战脚本(直接复制就能用)

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.sa ve(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% 的场景都够用了。

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
面向对象编程:继承与方法重写入门教程:核心概念、操作步骤与结果验证

面向对象编程:继承与方法重写入门教程:核心概念、操作步骤与结果验证

从父类与子类的关系入手,理解继承、方法重写和多态的基本机制,通过完整代码示例完成继承结构创建、方法重写与运行验证,并梳理常见错误和使用注意事项。

时间:2026-10-08 18:33
Python应用打包与部署入门教程:核心概念、操作步骤与结果验证

Python应用打包与部署入门教程:核心概念、操作步骤与结果验证

从 Python 应用打包的基本概念入手,介绍项目环境准备、依赖管理、构建发布包、安装部署以及运行结果验证,并梳理常见打包失败与部署问题,帮助初学者完成从源码到可部署应用的完整流程。

时间:2026-10-01 18:40
Python CLI 开发避坑指南:从环境配置到参数解析的实战排查

Python CLI 开发避坑指南:从环境配置到参数解析的实战排查

本文聚焦 Python 命令行工具(CLI)开发中最高频的故障点,按执行链路梳理从环境配置、参数解析、路径处理到异常调试的完整排查流程。通过具体代码示例与终端输出对照,提供可复现的修复方案,帮助开发者快速定位 ModuleNotFoundError、参数校验失败及跨平台兼容性问题,构建更健壮的命令行

时间:2026-10-01 18:35
Python CLI 开发:从参数解析到工程化发布的完整路径

Python CLI 开发:从参数解析到工程化发布的完整路径

本文以 Python 命令行工具开发为切入点,从项目结构搭建与虚拟环境配置入手,深入讲解 argparse 参数解析与子命令设计。通过一个完整的日志分析工具案例,演示输入校验、错误处理与异常捕获的最佳实践,最后覆盖打包发布流程与常见排查技巧,帮助开发者构建健壮、易用的 CLI 应用。

时间:2026-10-01 18:30
Python 模块与包的工程化实践:结构、依赖与排错指南

Python 模块与包的工程化实践:结构、依赖与排错指南

本文从项目目录规范与模块导入机制切入,详细阐述虚拟环境的配置、第三方包的管理策略以及完整案例的模块化拆分方法。通过具体代码示例展示如何构建高内聚低耦合的代码结构,并针对 ModuleNotFoundError、ImportError 及依赖冲突等常见工程问题提供系统化的排查与解决方案,帮助开发者建立

时间:2026-10-01 18:25
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全