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

再學GDI+[65]: 路徑漸層筆刷 Gamma 校正 - SetGammaCorrection 提升視覺真實度

     編輯:Delphi

前言

顯示裝置的亮度響應非線性,直接線性插值顏色會導致中間灰階偏暗。SetGammaCorrection(True) 啟用 sRGB Gamma 校正(γ≈2.2),讓漸層視覺亮度符合人眼感知,顏色過渡更自然。

Gamma 校正原理

  • 未校正:線性 RGB 插值,中間灰階亮度過低(視覺偏暗)
  • 已校正:套用反 Gamma 曲線插值,再由螢幕 Gamma 還原,視覺亮度線性
  • 適用場景:照片級漸層、UI 主題色、任何要求視覺準確的顏色過渡

左右對比實作

同一個三角形路徑筆刷,左側無校正,右側啟用 SetGammaCorrection(True)。

procedure TForm1.FormPaint(Sender: TObject);
const
  ColorArr: array[0..2] of TGPColor = (aclRed, aclGreen, aclBlue);
var
  pts: array[0..2] of TGPPoint;
  g: TGPGraphics;
  path: TGPGraphicsPath;
  pb: TGPPathGradientBrush;
  num: Integer;
begin
  pts[0] := MakePoint(80, 10);
  pts[1] := MakePoint(10, 150);
  pts[2] := MakePoint(150, 150);
  
  g := TGPGraphics.Create(Canvas.Handle);
  path := TGPGraphicsPath.Create;
  path.AddPolygon(PGPPoint(@pts), Length(pts));
  
  {根據點陣列建立筆刷 - 中心預設黑色}
  pb := TGPPathGradientBrush.Create(PGPPoint(@pts), Length(pts));
  pb.SetCenterColor(aclWhite);  {改為白色中心}
  num := Length(pts);
  pb.SetSurroundColors(PARGB(@ColorArr), num);
  
  {左側:無 Gamma 校正}
  g.FillPath(pb, path);
  
  {右側:啟用 Gamma 校正}
  pb.SetGammaCorrection(True);
  g.TranslateTransform(150, 0);
  g.FillPath(pb, path);
  
  pb.Free; path.Free; g.Free;
end;

執行效果預覽

Gamma 校正前後對比

觀察重點

  • 紅綠藍交會區:校正版中間白色區域更明亮、過渡更平滑
  • 邊緣飽和度:校正版邊緣顏色更飽和,不易產生灰暗感
  • 中心白色:校正版中心白色更純淨,無色偏

技術補充

  • SetGammaCorrection 影響所有後續繪製操作,屬於筆刷狀態
  • 僅對 FillPath、FillEllipse 等填充操作有效,不影響路徑幾何
  • 搭配 SetInterpolationColors 使用時,位置參數仍為線性空間
  • 現代顯示器多支援 sRGB,啟用校正通常能獲得更好結果

表單定義檔

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 163
  ClientWidth = 311
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved