简单来说,Imagecodecs 并不是一个像 Pillow 那样的“全能图片编辑器”。它更像是一个超级工具箱,里面装满了各种底层的压缩和解压算法(Codec)。
以下是针对你问题的详细拆解:
1. 它支持哪些图片输入/输出?
Imagecodecs 的强项在于科学成像、医学影像和专业摄影格式。
常见图片格式(全面支持读写):
JPEG (包括 8-bit, 12-bit, Lossless JPEG)
WebP、PNG、GIF、BMP
TIFF(通过
tifffile库配合使用效果极佳)
下一代/专业格式(全面支持读写):
JPEG XL (JXL)、AVIF
JPEG 2000、JPEG XR、JPEG LS
科学/原始数据格式:
ZFP (浮点压缩)、Blosc、LZW、ZStandard (ZSTD) 等专门用于大数据压缩的算法。
注意:它不直接支持像
.psd或复杂的.svg矢量图这种需要复杂渲染的格式。
2. 任意类型都能压缩成任意类型吗?
理论上可以,但中间必须经过 Numpy 这个“中转站”。
Imagecodecs 的逻辑是:
Decode(解码):把任何支持的格式(如 JPG)转成 Numpy 数组(原始像素数据)。
Encode(编码):把这个 Numpy 数组 转成另一种支持的格式(如 WebP)。
转换逻辑图:
任意源格式—(Decode)—>Numpy Array (原始像素)—(Encode)—>任意目标格式
代码示例:o
import imagecodecs
# 1. 读取 JPG 转为 Numpy 数组 (原始像素)
with open('input.jpg', 'rb') as f:
data = f.read()
pixels = imagecodecs.jpeg8_decode(data)
# 2. 将 Numpy 数组压缩为 WebP
webp_data = imagecodecs.webp_encode(pixels, quality=80)
# 3. 写入文件
with open('output.webp', 'wb') as f:
f.write(webp_data)
3. Imagecodecs vs Pillow:选哪个?
维度 | Pillow (你现在的代码) | Imagecodecs |
|---|---|---|
上手难度 | 简单,像操作文件 | 稍难,像在处理数组数据 |
压缩算法 | 较基础(标准 libjpeg/webp) | 极强(包含 MozJPEG, JPEG XL 等极致算法) |
功能范围 | 缩放、滤镜、文字、旋转 | 纯粹的压缩/解压 |
位深支持 | 主要支持 8-bit | 支持 12-bit, 16-bit, 32-bit (医学/天文级) |
适用场景 | 普通网站图片处理 | 需要极致压缩比、处理高精度医疗/科学图像 |
核心结论
如果你只是想把
.jpg变成.webp并且希望文件更小,Pillow 调优参数(如前文提到的method=6)通常就够了。如果你追求 Squoosh 级别的极致性能,或者需要处理 JPEG XL (JXL) 这种 Pillow 暂时支持不好的超前格式,那么 Imagecodecs 是 Python 界的顶级选择。
你想尝试用 Imagecodecs 来实现一个比 Pillow 压缩率更高的转换脚本吗?我可以提供完整代码。