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

C# 影像 Gamma 校正實作:ImageAttributes.SetGamma 應用

     編輯:關於C#

Gamma 校正概念

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 即可完成,無需手寫像素迴圈。

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