[C#] 濾鏡筆記 – 高對比
2012-12-08
圖像高對比,是一個一連串的複雜處理。
其概念,就是偏高值拉高 偏低值拉更低,而不是僅僅在特定方向移動的像素,
必須增加或減少像素集之間的差異。
原本我想說針對 200=> 255 , 50 =>0
但是對比不明顯也不好看…
就在網路上面找到公式
(((( 顏色色值 / 255.0) - 0.5) * 影響度 0~4 之間 ) + 0.5) * 255.0
C# Code :
/// <summary> /// 高對比 /// </summary> /// <param name="src"></param> /// <param name="effectThreshold"> 高對比程度 -100~100</param> /// <returns></returns>public Bitmap Contrast(Bitmap src,float effectThreshold)
{ // 依照 Format24bppRgb 每三個表示一 Pixel 0: 藍 1: 綠 2: 紅 BitmapData bitmapData = src.LockBits(new Rectangle(0, 0, src.Width, src.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); // 判斷是否在 -100~100effectThreshold = effectThreshold < -100 ? -100 : effectThreshold;
effectThreshold = effectThreshold > 100 ? 100 : effectThreshold;
effectThreshold = (float)((100.0 + effectThreshold) / 100.0);effectThreshold *= effectThreshold;
unsafe { // 抓住第一個 Pixel 第一個數值byte* p = (byte*)(void*)bitmapData.Scan0;
// 跨步值 - 寬度 *3 可以算出畸零地 之後跳到下一行 int nOffset = bitmapData.Stride - src.Width * 3;for (int y = 0; y < src.Height; y++)
{for (int x = 0; x < src.Width; x++)
{ double buffer= 0; // 公式 (Red/255)-0.5= 偏離中間值程度 // ((偏離中間值程度 * 影響範圍)+0.4 ) * 255buffer = ((((p[2] / 255.0) - 0.5) * effectThreshold) + 0.5) * 255.0;
buffer = buffer > 255 ? 255 : buffer;
buffer = buffer < 0 ? 0 : buffer;
p[2] = (byte)buffer;buffer = ((((p[1] / 255.0) - 0.5) * effectThreshold) + 0.5) * 255.0;
buffer = buffer > 255 ? 255 : buffer;
buffer = buffer < 0 ? 0 : buffer;
p[1] = (byte)buffer;buffer = ((((p[0] / 255.0) - 0.5) * effectThreshold) + 0.5) * 255.0;
buffer = buffer > 255 ? 255 : buffer;
buffer = buffer < 0 ? 0 : buffer;
p[0] = (byte)buffer; // 跳去下一個 Pixelp += 3;
}
// 跨越畸零地p += nOffset;
}
}
src.UnlockBits(bitmapData);
return src;}
結果
正 50:
var res = Contrast(img,50);
正 100
-20
-100 :
因為最後進入公式 ((((Red/255)-0.5)*0)+0.5)*255=127
RGB 127 就是灰色了…
