2008年5月18日日曜日

[.NET]画像処理グレースケール化(1)

.NET Frameworkを使用したWindowsアプリケーションでは、簡単に画像を画面に表示することができます。
簡単に言うと、画像をBitmapに読み込み、PictureBoxのImageプロパティに設定するだけです。

しかし、その画像をなんらか加工するためには、自力で処理する必要があります。たとえは画像をグレースケール化するためには、RGBの値の平均値をRGBそれぞれにセットするという式処理することができます。
コードの例は、こんな感じ。

Bitmap bmp = new Bitmap(ctlPicture.Image);
for (int i = 0i < bmp.Widthi++)
{
    for (int j = 0j < bmp.Heightj++)
    {
        Color color = bmp.GetPixel(ij);
        // 計算式にて、値を算出してセットする
        //int col = (int)((color.R + color.G + color.B) / 3);
        int col = (int)Math.Round((double)(color.R + color.G + color.B) / 3);
        bmp.SetPixel(ijColor.FromArgb(colcolcol));
    }
}
ctlPicture.Image = bmp;


しかしGetPixelとSetPixelを使ったやり方は、パフォーマンスが出ません。
ちなみに、
  • CPU:C2D 2.0GHz
  • メモリ:2GB
  • 対象の画像:645×425 24bitカラー

という環境で動作させると、この方法では約700ms程度の時間がかかります(リリースコンパイルで実行)。
次回、これを高速化する方法を紹介します。

0 件のコメント: