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

GDI+ 進階 (96):ColorMatrix 顏色剪取/通道混合數學原理

     編輯:Delphi

核心概念:5x5 色彩矩陣

GDI+ 使用 5x5 矩陣 (TColorMatrix) 進行線性顏色變換。輸入向量 (R, G, B, A, 1),輸出 (R', G', B', A', 1)。矩陣第 5 行控制平移 (偏移),前 4x4 控制縮放、混合、旋轉。

矩陣結構定義


TColorMatrix = array[0..4, 0..4] of Single;
// 行優先:Matrix[Row, Col]
// 輸出分量 = Σ Input[Col] * Matrix[Row, Col] + Matrix[Row, 4]

三類「剪取/通道混合」矩陣模板

1. 紅色通道吸收綠/藍 (紅色增加綠色 m 倍、藍色 n 倍)


// 輸出 R' = R + m*G + n*B
// 輸出 G' = G
// 輸出 B' = B
ColorMatrix = (
  (1.0, 0.0, 0.0, 0.0, 0.0),  // R' = 1*R + 0*G + 0*B + 0*A + 0
  (m,   1.0, 0.0, 0.0, 0.0),  // G' = m*R + 1*G + 0*B + 0*A + 0  (注意: 原文此處行列轉置, 正確見下)
  (n,   0.0, 1.0, 0.0, 0.0),  // B' = n*R + 0*G + 1*B + 0*A + 0
  (0.0, 0.0, 0.0, 1.0, 0.0),  // A' = A
  (0.0, 0.0, 0.0, 0.0, 1.0)   // W  = 1
);

修正:GDI+ 矩陣乘法為 Out = In * Matrix (行向量左乘),即 Out[c] = Σ In[k] * Matrix[k, c]。因此「紅色增加綠色 m 倍」應設置 Matrix[1, 0] = m (綠色行、紅色列)。

正確模板:通道交叉混合

目標矩陣非零元素 (除對角線 1.0)數學含義
紅 ← 綠 (m倍)Matrix[0, 1] = mR' = R + m*G
紅 ← 藍 (n倍)Matrix[0, 2] = nR' = R + n*B
綠 ← 紅 (m倍)Matrix[1, 0] = mG' = G + m*R
綠 ← 藍 (n倍)Matrix[1, 2] = nG' = G + n*B
藍 ← 紅 (m倍)Matrix[2, 0] = mB' = B + m*R
藍 ← 綠 (n倍)Matrix[2, 1] = nB' = B + n*G

2. 完整矩陣示例:紅色吸收綠色 0.5 倍、藍色 0.3 倍


var CM: TColorMatrix = (
  (1.0, 0.5, 0.3, 0.0, 0.0),  // R' = R + 0.5G + 0.3B
  (0.0, 1.0, 0.0, 0.0, 0.0),  // G' = G
  (0.0, 0.0, 1.0, 0.0, 0.0),  // B' = B
  (0.0, 0.0, 0.0, 1.0, 0.0),  // A' = A
  (0.0, 0.0, 0.0, 0.0, 1.0)   // W  = 1
);

3. 通道交換 (紅↔綠)


var CM: TColorMatrix = (
  (0.0, 1.0, 0.0, 0.0, 0.0),  // R' = G
  (1.0, 0.0, 0.0, 0.0, 0.0),  // G' = R
  (0.0, 0.0, 1.0, 0.0, 0.0),  // B' = B
  (0.0, 0.0, 0.0, 1.0, 0.0),  // A' = A
  (0.0, 0.0, 0.0, 0.0, 1.0)
);

應用代碼模板


uses GDIPOBJ, GDIPAPI;

procedure ApplyColorMatrix(const SrcImg: TGPImage; const Matrix: TColorMatrix; Canvas: TCanvas; X, Y: Integer);
var
  Gr: TGPGraphics;
  Attr: TGPImageAttributes;
begin
  Gr := TGPGraphics.Create(Canvas.Handle);
  Attr := TGPImageAttributes.Create;
  try
    Attr.SetColorMatrix(Matrix);
    Gr.DrawImage(SrcImg,
      MakeRect(X, Y, SrcImg.GetWidth, SrcImg.GetHeight),
      0, 0, SrcImg.GetWidth, SrcImg.GetHeight, UnitPixel, Attr);
  finally
    Attr.Free;
    Gr.Free;
  end;
end;

數學本質總結

  • 線性變換:每個輸出通道是輸入通道的線性組合 (+ 平移)。
  • 可疊加:多個矩陣可通過矩陣乘法合併為單一矩陣 (TGPMatrix.Multiply)。
  • 範圍截斷:結果自動 Clamp 到 [0, 255],超出截斷不報錯。
  • Alpha 通道同理:第 4 行/列控制透明度混合與平移。

總結

ColorMatrix「剪取/混合」本質是通道間線性加權。關鍵記住 Matrix[目標行, 源列] = 權重 (行向量左乘約定)。掌握 6 個交叉位置 (0,1)/(0,2)/(1,0)/(1,2)/(2,0)/(2,1) 即可實現任意通道混合、交換、提取效果,是 GDI+ 顏色處理的核心數學工具。

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