首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC++ CxImage 儲存全透明 BMP 後 Alpha 通道變不透明的解決方案

     編輯:程式設計綜合問答

問題現象


CxImage img;
img.Load(_T("d:\\0.bmp"), CXIMAGE_FORMAT_BMP); // 原圖含 Alpha 通道 (全透明)
img.Save(_T("d:\\1.bmp"), CXIMAGE_FORMAT_BMP); // 儲存後 Alpha 全變 0xFF (不透明)

若原圖 Alpha 非全透明 (如半透明),儲存後正常。

根本原因

CxImage 內部 BMP 編碼器在處理 32-bit BMP (含 Alpha) 時,預設強制將 Alpha 通道設為 0xFF,導致全透明圖層變成不透明。此為庫已知限制/Bug。

解決方案

  1. 修改庫原始碼 (推薦):在 ximabmp.cpp 的 CxImageBMP::Encode 函式中,找到寫入像素資料的迴圈,移除或註解掉強制設定 Alpha 的邏輯:

// 原始碼片段 (約線 1200)
for (y=0; y
  1. 儲存為 PNG 格式:PNG 原生支援 Alpha,避開 BMP 編碼問題:

img.Save(_T("d:\\1.png"), CXIMAGE_FORMAT_PNG);
  1. 手動修正 Alpha 後再存 BMP:儲存前遍歷像素將 Alpha 還原 (效能較差):

for (int y=0; y

建議策略

  • 專案允許:改用 PNG,最省事且相容性最好。
  • 必須輸出 BMP:重新編譯 CxImage 並修正 Encode 邏輯,一勞永逸。
  • 臨時方案:儲存前手動修正 Alpha。

補充知識

Windows 標準 BMP 格式 (BI_RGB) 雖定義 32-bit 含保留位元組,但歷史版本不解析 Alpha。若需相容舊系統,建議輸出 24-bit BMP + 獨立 Alpha 遮罩檔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved