[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);


2012-08-16_200245



正 100


2012-08-16_200346



-20


2012-08-16_200744



-100 :


因為最後進入公式  ((((Red/255)-0.5)*0)+0.5)*255=127


2012-08-16_201105


RGB 127 就是灰色了…


2012-08-16_201200


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