You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用OpenCV cv2或PIL/Pillow保存无损压缩多图层开放格式图像

如何用OpenCV或PIL/Pillow保存无损多图层图像(类PSD开放格式)

核心结论

OpenCV原生不支持多图层图像的写入,优先使用PIL/Pillow实现需求。推荐两种方案:带Deflate压缩的TIFF(开放格式、无损、压缩率接近PNG),或PSD格式(兼容Photoshop)。


一、PIL/Pillow实现方案

1. 多图层TIFF(Deflate压缩,压缩率看齐PNG)

TIFF是开放标准,支持多图层,通过指定deflate压缩(与PNG同算法)可解决原生TIFF压缩率低的问题,完全满足无损+多图层需求。

代码示例:

from PIL import Image

# 假设layer1、layer2、layer3为已加载的PIL.Image对象(建议用RGBA模式保留透明度)
layers = [layer1, layer2, layer3]

# 保存多图层TIFF
layers[0].save(
    "multi_layer.tiff",
    format="TIFF",
    save_all=True,  # 启用多图层保存
    append_images=layers[1:],  # 追加除第一个图层外的其余图层
    compression="deflate",  # 启用Deflate无损压缩
    resolution_unit=2,
    dpi=(96, 96)  # 可选:指定分辨率
)

2. PSD格式(兼容Photoshop)

如果需要直接在Photoshop中编辑,可保存为PSD格式(无损,但开放性不如TIFF):

from PIL import Image

layers = [layer1, layer2, layer3]

layers[0].save(
    "multi_layer.psd",
    format="PSD",
    save_all=True,
    append_images=layers[1:]
)

二、OpenCV的处理方式

OpenCV的cv2.imwrite仅支持单图层图像,需先将OpenCV的Mat对象转换为PIL Image,再用上述方案保存:

import cv2
from PIL import Image
import numpy as np

def cv_mat_to_pil(cv_img):
    # 转换OpenCV的BGR/BGRA格式为PIL的RGBA格式
    if len(cv_img.shape) == 3:
        cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGBA)
    return Image.fromarray(cv_img)

# 假设layer1、layer2、layer3为OpenCV Mat对象
pil_layers = [cv_mat_to_pil(layer) for layer in [layer1, layer2, layer3]]

# 复用PIL的多图层保存逻辑
pil_layers[0].save(
    "multi_layer_cv.tiff",
    format="TIFF",
    save_all=True,
    append_images=pil_layers[1:],
    compression="deflate"
)

内容的提问来源于stack exchange,提问作者Basj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:55:08