python - Imagecodecs

简单来说,Imagecodecs 并不是一个像 Pillow 那样的“全能图片编辑器”。它更像是一个超级工具箱,里面装满了各种底层的压缩和解压算法(Codec)。

以下是针对你问题的详细拆解:

1. 它支持哪些图片输入/输出?

Imagecodecs 的强项在于科学成像医学影像专业摄影格式。

  • 常见图片格式(全面支持读写)

    • JPEG (包括 8-bit, 12-bit, Lossless JPEG)

    • WebPPNGGIFBMP

    • TIFF(通过 tifffile 库配合使用效果极佳)

  • 下一代/专业格式(全面支持读写)

    • JPEG XL (JXL)、AVIF

    • JPEG 2000JPEG XRJPEG LS

  • 科学/原始数据格式

    • ZFP (浮点压缩)、BloscLZWZStandard (ZSTD) 等专门用于大数据压缩的算法。

注意:它不直接支持像 .psd 或复杂的 .svg 矢量图这种需要复杂渲染的格式。


2. 任意类型都能压缩成任意类型吗?

理论上可以,但中间必须经过 Numpy 这个“中转站”。

Imagecodecs 的逻辑是:

  1. Decode(解码):把任何支持的格式(如 JPG)转成 Numpy 数组(原始像素数据)。

  2. 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 压缩率更高的转换脚本吗?我可以提供完整代码。