首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

GDI+ 進階議題:透明度處理(五)——Alpha 通道與 32bppArgb 實作

     編輯:關於.NET

6. 透明、半透明與不透明

WinForm/WPF 常見 BackColor.Transparent、Form.Opacity 皆屬應用層封裝。本文從 GDI+ 底層探討。

6.1 Alpha 通道

PixelFormat.Format32bppArgb 含 A/R/G/B 四通道,A 為透明度(0 全透明、255 不透明)。此概念由 Catmull 與 Smith 於 70 年代初提出,透過 Alpha 混合演算法實現前景與背景疊加。詳細原理。

將圖像轉為半透明

public unsafe Bitmap GenerateBitmap(byte alpha)
{
    FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read);
    Image img = Image.FromStream(fs, false, false);
    Bitmap bmp = new Bitmap(img);
    img.Dispose(); fs.Close();

    int w = bmp.Width, h = bmp.Height;
    BitmapData bmData = bmp.LockBits(new Rectangle(0,0,w,h), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
    byte* p = (byte*)bmData.Scan0;
    int offset = bmData.Stride - w * 4; // 每像素 4 bytes

    for (int y=0; y

注意: 小端序下記憶體順序為 B、G、R、A,故 Alpha 索引為 p[3]。Format32bppPArgb 為預乘 Alpha 格式,RGB 已乘入 Alpha,減少運算。

儲存格式限制

  • PNG: 唯一支援保留 Alpha 通道的常用格式。
  • BMP: 變為 Format32bppRgb,第 4 byte 棄用。
  • JPEG: 轉為 Format24bppRgb,Alpha 丟失。
  • GIF: 轉為 Format8bppIndexed,Alpha 無效(下節討論 GIF 透明處理)。

標準規定 BMP/JPEG 不支援透明通道,GIF 雖支援透明但機制不同(索引色)。

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