最近在試寫濾鏡.. 先從簡單的開始..
其實顏色原理就是由象素所組成,每一個象素的顏色敘述會分成 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;
}
但是我在網路上面看到 她們推薦最好的公式為
var newPixel = Convert.ToInt32(pixel.R * .3) + Convert.ToInt32(pixel.G * 59) + Convert.ToInt32(pixel.B * 11);
差異度似乎不高 …
但是我看到一個很酷的寫法..
//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