Gamma 曲線描述人眼對光亮度的非線性感知。val < 1 變亮、val > 1 變暗、val = 1 無變化。常用於影像增強、曝光補償。
///
/// Gamma 校正
///
/// 來源 Bitmap
/// Gamma 值 [0(亮) - 1(原) - 2(暗)]
/// 校正後 Bitmap
public static Bitmap KiGamma(Bitmap bmp, float val)
{
if (bmp == null) return null;
if (Math.Abs(val - 1f) < 0.0001f) return bmp; // 無變化快速返回
try
{
Bitmap result = new Bitmap(bmp.Width, bmp.Height);
using (Graphics g = Graphics.FromImage(result))
{
ImageAttributes attr = new ImageAttributes();
attr.SetGamma(val, ColorAdjustType.Bitmap);
g.DrawImage(bmp,
new Rectangle(0, 0, bmp.Width, bmp.Height),
0, 0, bmp.Width, bmp.Height,
GraphicsUnit.Pixel, attr);
}
return result;
}
catch
{
return null;
}
}
ImageAttributes.SetGamma 內建查表法,效能優於逐像素運算。ColorAdjustType.Bitmap 指定套用於位圖資料。DrawImage 多載參數:目標矩形、來源矩形、單位、屬性物件。Bitmap,原圖不變更,符合函數式風格。Bitmap original = (Bitmap)Image.FromFile("photo.jpg");
Bitmap brighter = KiGamma(original, 0.5f); // 變亮
Bitmap darker = KiGamma(original, 1.5f); // 變暗
brighter.Save("bright.jpg");
darker.Save("dark.jpg");
public static Bitmap GammaLut(Bitmap src, float gamma)
{
byte[] lut = new byte[256];
for (int i = 0; i < 256; i++)
lut[i] = (byte)Math.Min(255, Math.Pow(i / 255.0, 1.0 / gamma) * 255);
BitmapData data = src.LockBits(...);
unsafe { /* 逐像素套用 lut */ }
src.UnlockBits(data);
return src;
}
適用於即時影像處理、大量批次處理場景。
ImageAttributes.SetGamma 提供簡潔高效的 Gamma 校正,配合 Graphics.DrawImage 即可完成,無需手寫像素迴圈。