[C#] 濾鏡筆記 – 色調濾鏡

2012-12-03

 

這幾天寫到幾篇文章,其實發現都是在設定R G B 的變化..

其實帶色調濾鏡 就是將一個值拉高 將其他值降低來達到的效果..

譬如純紅濾鏡..

/// <summary>
/// 純紅濾鏡
/// </summary>
/// <param name="bitmap">Bitmap</param>
/// <param name="threshold">門檻值 -255~255</param>
/// <returns></returns>
public System.Drawing.Bitmap AdjustToRed(System.Drawing.Bitmap bitmap, int threshold)
{
    for (int y = 0; y < bitmap.Height; y++)
    {
        for (int x = 0; x < bitmap.Width; x++)
        {
            // 取得每一個 pixel
            var pixel = bitmap.GetPixel(x, y);
            var pR = pixel.R + threshold;
            pR = Math.Max(pR, 0);
            pR = Math.Min(255, pR);
            // 將改過的 RGB 寫回
            // 只寫入紅色的值 , G B 都放零
            System.Drawing.Color newColor = System.Drawing.Color.FromArgb(pixel.A, pR, 0, 0);
            bitmap.SetPixel(x, y, newColor);
        }
    }
    // 回傳結果
    return bitmap;
}



其中比較特別的 就是我加入了門檻值 所以會提高紅色的深度


測試結果


-155 :


var img = AdjustToRed(bitmap, -155);

2012-10-04_131904


+155:


var img = AdjustToRed(bitmap, 155);

2012-10-04_131918


0:


var img = AdjustToRed(bitmap, 0);


2012-10-04_131928



這邊也附上 藍色 跟 綠色的 函式


綠色的濾鏡:

/// <summary>
/// 純綠濾鏡
/// </summary>
/// <param name="bitmap"></param>
/// <param name="threshold">門檻值 -255~+255</param>
/// <returns></returns>
public System.Drawing.Bitmap AdjustToGreen(System.Drawing.Bitmap bitmap, int threshold)
{
    for (int y = 0; y < bitmap.Height; y++)
    {
        for (int x = 0; x < bitmap.Width; x++)
        {
            // 取得每一個 pixel
            var pixel = bitmap.GetPixel(x, y);
            //判斷是否超過255 如果超過就是255 
            var pG = pixel.G + threshold;
            //如果小於0就為0
            if (pG > 255) pG = 255;
            if (pG < 0) pG = 0;
            // 將改過的 RGB 寫回
            // 只寫入綠色的值 , R B 都放零
            System.Drawing.Color newColor = System.Drawing.Color.FromArgb(pixel.A, 0, pG, 0);
            bitmap.SetPixel(x, y, newColor);
        }
    }
    // 回傳結果
    return bitmap;
}


藍色的濾鏡:

/// <summary>
/// 純藍濾鏡
/// </summary>
/// <param name="bitmap"></param>
/// <param name="threshold">門檻值 -255~255</param>
/// <returns></returns>
public System.Drawing.Bitmap AdjustToBlue(System.Drawing.Bitmap bitmap, int threshold)
{
    for (int y = 0; y < bitmap.Height; y++)
    {
        for (int x = 0; x < bitmap.Width; x++)
        {
            // 取得每一個 pixel
            var pixel = bitmap.GetPixel(x, y);
            //判斷是否超過255 如果超過就是255 
            var pB = pixel.B + threshold;
            //如果小於0就為0
            if (pB > 255) pB = 255;
            if (pB < 0) pB = 0;
            // 將改過的 RGB 寫回
            // 只寫入藍色的值 , R G 都放零
            System.Drawing.Color newColor = System.Drawing.Color.FromArgb(pixel.A, 0, 0, pB);
            bitmap.SetPixel(x, y, newColor);
        }
    }
    // 回傳結果
    return bitmap;
}


當然你就會想了 這種濾鏡 實用度有點低所以 就乾脆直接自訂…

/// <summary>
 /// 調整 RGB 色調
 /// </summary>
 /// <param name="bitmap"></param>
 /// <param name="thresholdRed">紅色門檻值</param>
 /// <param name="thresholdBlue">藍色門檻值</param>
 /// <param name="thresholdGreen">綠色門檻值</param>
 /// <returns></returns>
 public System.Drawing.Bitmap AdjustToCustomColor(System.Drawing.Bitmap bitmap, int thresholdRed, int thresholdGreen, int thresholdBlue)
 {
     for (int y = 0; y < bitmap.Height; y++)
     {
         for (int x = 0; x < bitmap.Width; x++)
         {
             // 取得每一個 pixel
             var pixel = bitmap.GetPixel(x, y);
             //判斷是否超過255 如果超過就是255 
             var pG = pixel.G + thresholdGreen;
             //如果小於0就為0
             if (pG > 255) pG = 255;
             if (pG < 0) pG = 0;
             //判斷是否超過255 如果超過就是255 
             var pR = pixel.R + thresholdRed;
             //如果小於0就為0
             if (pR > 255) pR = 255;
             if (pR < 0) pR = 0;
             //判斷是否超過255 如果超過就是255 
             var pB = pixel.B + thresholdBlue;
             //如果小於0就為0
             if (pB > 255) pB = 255;
             if (pB < 0) pB = 0;
             // 將改過的 RGB 寫回
             // 只寫入綠色的值 , R B 都放零
             System.Drawing.Color newColor = System.Drawing.Color.FromArgb(pixel.A, pR, pG, pB);
             bitmap.SetPixel(x, y, newColor);
         }
     }
     return bitmap;
 }


看一下幾個測試結果:
拉高紅色調

var img = AdjustToCustomColor(bitmap, 100,10,10);
2012-10-04_131945



拉高綠色調 :

var img = AdjustToCustomColor(bitmap, 10,100,10);
2012-10-04_131958



拉高藍色調:因為我也拉高一點點其他顏色 所以會帶有紫色效果

var img = AdjustToCustomColor(bitmap, 10,10,100);
2012-10-04_132015



這種方式就可以搭配作出不同色調,因為純紅純綠純藍效果會比較不常被使用..


參考文件:http://www.dotblogs.com.tw/chhuang/archive/2008/03/18/1814.aspx


當麻許的超技八 2014 | Donma Hsu Design.