问题场景

你有没有遇到这样的情况:

  • 手机拍了100张照片,想发朋友圈,但每张都10MB+
  • 项目需要上传图片,但文件太大,超出限制
  • 网站需要大量图片,但存储空间不够

手动一张张压缩?太慢了!

今天教你用 Python 一键批量压缩图片。

────────────────────────────────────────

准备工作

安装依赖

```bash

pip install Pillow

```

导入库

```python

from PIL import Image

import os

```

────────────────────────────────────────

完整代码

```python

from PIL import Image

import os

def compress_images(input_dir, output_dir, quality=85, max_width=1920):

"""

批量压缩图片

参数:

  • input_dir: 输入文件夹路径
  • output_dir: 输出文件夹路径
  • quality: 压缩质量(1-100,默认85)
  • max_width: 最大宽度(超过则缩放,默认1920)

"""

创建输出文件夹

if not os.path.exists(output_dir):

os.makedirs(output_dir)

支持的图片格式

supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.webp']

遍历所有文件

for filename in os.listdir(input_dir):

检查是否为支持的图片格式

ext = os.path.splitext(filename)[1].lower()

if ext not in supported_formats:

continue

打开图片

input_path = os.path.join(input_dir, filename)

output_path = os.path.join(output_dir, filename)

try:

img = Image.open(input_path)

缩放图片(如果超过最大宽度)

if img.width > max_width:

ratio = max_width / img.width

new_height = int(img.height * ratio)

img = img.resize((max_width, new_height), Image.LANCZOS)

PNG转JPG(可选)

if ext == '.png':

转换为RGB模式(PNG可能有透明通道)

img = img.convert('RGB')

output_path = os.path.join(output_dir,

os.path.splitext(filename)[0] + '.jpg')

保存压缩后的图片

img.save(output_path, quality=quality, optimize=True)

计算压缩比例

original_size = os.path.getsize(input_path) / 1024

compressed_size = os.path.getsize(output_path) / 1024

ratio = (1 - compressed_size / original_size) * 100

print(f'✅ {filename}: {original_size:.1f}KB → {compressed_size:.1f}KB (压缩{ratio:.1f}%)')

except Exception as e:

print(f'❌ {filename}: 压缩失败 - {e}')

使用示例

if __name__ == '__main__':

input_dir = '原始图片'  # 输入文件夹

output_dir = '压缩图片'  # 输出文件夹

compress_images(input_dir, output_dir, quality=80, max_width=1920)

print('\n�� 批量压缩完成!')

```

────────────────────────────────────────

代码解析

1. 参数说明

| 参数 | 说明 | 默认值 |

|------|------|--------|

| input_dir | 原始图片文件夹 | 必填 |

| output_dir | 压缩后输出文件夹 | 必填 |

| quality | 压缩质量(1-100) | 85 |

| max_width | 最大宽度(像素) | 1920 |

2. 核心步骤

  1. **遍历文件夹**:找到所有支持的图片格式
  2. **缩放图片**:如果宽度超过 max_width,等比例缩放
  3. **压缩保存**:使用 quality 参数控制压缩质量

3. 压缩效果

| 参数 | 效果 |

|------|------|

| quality=90 | 高质量,压缩少 |

| quality=85 | 平衡质量与大小 |

| quality=70 | 较小体积,质量下降 |

────────────────────────────────────────

进阶功能

1. 保留透明通道(PNG)

```python

如果PNG有透明通道,保持透明

if img.mode == 'RGBA':

img.save(output_path, 'PNG', optimize=True)

else:

img = img.convert('RGB')

img.save(output_path, 'JPEG', quality=quality, optimize=True)

```

2. 批量重命名

```python

在循环中添加

new_name = f'image_{i:04d}.jpg'  # image_0001.jpg

output_path = os.path.join(output_dir, new_name)

```

3. 递归处理子文件夹

```python

for root, dirs, files in os.walk(input_dir):

for filename in files:

处理每个文件

```

────────────────────────────────────────

实际效果

测试环境:100张手机照片,每张约 10MB

| 指标 | 压缩前 | 压缩后 |

|------|--------|--------|

| 总大小 | 1.0GB | 150MB |

| 单张大小 | 10MB | 1.5MB |

| 压缩比例 | - | 85% |

| 处理时间 | - | 约30秒 |

────────────────────────────────────────

使用场景

  1. **网站图片优化**:减少加载时间,提升用户体验
  2. **手机相册瘦身**:节省存储空间
  3. **批量上传**:减少上传时间
  4. **邮件附件**:避免超出大小限制

────────────────────────────────────────

总结

核心价值

  • 节省 90% 存储空间
  • 批量处理,效率提升 100 倍
  • 简单易用,复制粘贴即可

适用场景

  • 网站图片优化
  • 手机相册瘦身
  • 批量上传准备

────────────────────────────────────────

#Python #自动化 #图片压缩 #效率提升

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐