如何用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
相关产品推荐
相关产品推荐

