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

打开并保存.bmp文件导致位深度改变的技术问题

解决cv2读取/保存32位RGBA BMP丢失Alpha通道的问题

问题重现

我有一个位深度32的RGBA格式BMP文件test.bmp,用OpenCV 4.7.0的cv2.imread并指定cv2.IMREAD_UNCHANGED读取后,图像形状显示为(1200, 1920, 3),丢失了Alpha通道;保存后图像位深度变为24,无法满足后续32位输出的需求。

读取代码:

img_path = os.path.join(path_to_folder, "test.bmp")
img = np.array(cv2.imread(img_path, flags=cv2.IMREAD_UNCHANGED))

保存代码:

out_f_name = os.path.join(save_to_test, "test_save.bmp")
cv2.imwrite(out_f_name, img)

原因分析

  1. OpenCV的cv2.imread对部分非标准32位BMP的Alpha通道支持不佳,即使指定IMREAD_UNCHANGED也可能无法正确识别Alpha通道;
  2. 使用cv2.imwrite保存时,默认不会保留Alpha通道,需要显式指定保存参数。

解决方案

方案1:用Pillow读取BMP再转OpenCV格式

Pillow对BMP的Alpha通道兼容性更好,读取后转换为OpenCV的BGRA格式(OpenCV默认采用BGR通道顺序):

from PIL import Image
import numpy as np
import cv2
import os

img_path = os.path.join(path_to_folder, "test.bmp")
# 用Pillow读取RGBA图像
pil_img = Image.open(img_path).convert("RGBA")
# 转换为numpy数组,再转成OpenCV的BGRA格式
cv_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGBA2BGRA)
print(cv_img.shape)  # 输出应为(1200, 1920, 4)

方案2:正确保存32位BGRA BMP

读取到完整的4通道图像后,保存时需要指定cv2.IMWRITE_BMP_FLAGS为cv2.IMWRITE_BMP_SAVE_ALPHA,确保Alpha通道被保留:

out_f_name = os.path.join(save_to_test, "test_save.bmp")
# 指定保存参数,保留Alpha通道
cv2.imwrite(out_f_name, cv_img, [cv2.IMWRITE_BMP_FLAGS, cv2.IMWRITE_BMP_SAVE_ALPHA])

验证

保存后查看图像属性,位深度应显示为32,图像形状保持4通道。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:40:47