[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~100
effectThreshold = 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 ) * 255
buffer = ((((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;
// 跳去下一個 Pixel
p += 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 就是灰色了…