2012-10-04

[C#] 濾鏡筆記 - 圖片轉黑白

 

最近在試寫濾鏡.. 先從簡單的開始..

其實顏色原理就是由象素所組成,每一個象素的顏色敘述會分成 ARGB..

其實只要會去操控那些值就可以產生不同效果..

所以將個顏色都 乘上 0.33 也就是除以 3 ..

C# Code :

public Bitmap ConvertToBlackWhite(System.Drawing.Image img)
{
// 讀入欲轉換的圖片並轉成為 Bitmap
Bitmap bitmap = new System.Drawing.Bitmap(img);
for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
// 取得每一個 pixel
var pixel = bitmap.GetPixel(x, y);

var newPixel = Convert.ToInt32(pixel.R * .33) + Convert.ToInt32(pixel.G * .33) + Convert.ToInt32(pixel.B * .33);

Color newColor = Color.FromArgb(pixel.A, newPixel, newPixel, newPixel);
bitmap.SetPixel(x, y, newColor);

}
}
// 顯示結果
return bitmap;
}

2012-10-04_133551


但是我在網路上面看到 她們推薦最好的公式為


var newPixel = Convert.ToInt32(pixel.R * .3) + Convert.ToInt32(pixel.G * 59) + Convert.ToInt32(pixel.B * 11);


2012-10-04_133606


差異度似乎不高 …


但是我看到一個很酷的寫法..


//create kthe grayscale ColorMatrixk
ColorMatrix colorMatrix = new ColorMatrix(
new float[][]
{
float[] {.3f, .3f, .3f, 0, 0},
float[] {.59f, .59f, .59f, 0, 0},
float[] {.11f, .11f, .11f, 0, 0},
float[] {0, 0, 0, 1, 0},
float[] {0, 0, 0, 0, 1}
});

他利用矩陣 去做處理速度會更加快速..


我也不好意思把程式碼轉過來 …


可以參考: http://www.switchonthecode.com/tutorials/csharp-tutorial-convert-a-color-image-to-grayscale