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

GDI+ 進階議題:Graphics 合成模式與合成品質深度解析

     編輯:關於.NET

10. Graphics 關鍵屬性詳解

Graphics 是 GDI+ 核心,負責繪圖、填充、影像處理。本文聚焦兩個常被忽視但極重要的屬性:CompositingMode 與 CompositingQuality。

a. CompositingMode 合成模式

列舉屬性,兩種值:

  • SourceOver(預設): 源顏色與背景混合。演算法:
    顯示顏色 = 源顏色 × alpha/255 + 背景顏色 × (255-alpha)/255
    結果透明度固定為 255(不透明)。
  • SourceCopy: 直接複製源顏色,不與背景混合(忽略 alpha 混合)。

程式碼示範

private int CompositeColor(int color, int alpha, int backgroudColor)
{
    return color * alpha / 255 + backgroudColor * (255 - alpha) / 255;
}

private void Draw(object sender, EventArgs e)
{
    this.BackColor = Color.FromArgb(255, 255, 255);
    Graphics g = this.CreateGraphics();

    // 1. SourceOver:半透明紅色與白背景混合 → 淺紅
    g.CompositingMode = CompositingMode.SourceOver;
    g.FillRectangle(new SolidBrush(Color.FromArgb(127, 255, 0, 0)), new Rectangle(0, 0, 200, 200));

    // 2. SourceCopy:直接畫半透明紅色(背景被忽略) → 純半透明紅
    g.CompositingMode = CompositingMode.SourceCopy;
    g.FillRectangle(new SolidBrush(Color.FromArgb(127, 255, 0, 0)), new Rectangle(200, 0, 200, 200));

    // 3. SourceCopy 但手動預乘混合 → 效果等同第 1 區塊
    g.CompositingMode = CompositingMode.SourceCopy;
    g.FillRectangle(new SolidBrush(Color.FromArgb(
        255,
        CompositeColor(255, 127, 255),
        CompositeColor(0, 127, 255),
        CompositeColor(0, 127, 255))),
        new Rectangle(0, 200, 200, 200));

    g.Dispose();
}

CompositingMode 比較圖

若需在 SourceCopy 下獲得混合效果,必須自行預乘計算(如第 3 區塊)。

b. CompositingQuality 合成品質

五種等級:

成員說明
AssumeLinear假設線性插值,品質略優於 Default,速度稍慢
Default預設基本計算
GammaCorrected套用 Gamma 灰度校正,不做計算優化
HighQuality高品質、低速度:平滑鋸齒 + Gamma 校正
HighSpeed高速度、低品質:優化計算,一般情況差異不明顯
Invalid無效值(未定義行為)

原理淺析

影像合成涉及大量浮點運算與量化,易產生鋸齒。多層透明疊加更需重複運算。CompositingQuality 由 GDI+ 內部優化這些過程:

  • HighQuality / GammaCorrected: 視覺效果相同,皆含 Gamma 校正與平滑處理。
  • 其餘四種: 效果近似,差異在計算速度與是否假設線性插值。

CompositingQuality 比較圖

實務上若不極度追求品質,HighSpeed 或 Default 通常足夠;列印或專業輸出建議 HighQuality。

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