2008年12月24日水曜日

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

以前、Unsafeを使わずに配列処理の処理をし画像をグレースケール化するGDD Blog: [.NET]画像処理グレースケール化(1)
GDD Blog: [.NET]画像処理グレースケール化(2) GDD Blog: [.NET]画像処理グレースケール化(3) という記事を書きましたが、パフォーマンスの比較をするためにあえてUnsafeを使ってパフォーマンスを計測してみました。コードはこんな感じ。


//以下の構造体を別途定義
//private struct RGB
//{
//    public byte b;
//    public byte g;
//    public byte r;
//}

Bitmap bmp = new Bitmap(ctlPicture.Image);

//bitmapをメモリ上にロックします
Rectangle rect = new Rectangle(00bmp.Widthbmp.Height);
BitmapData bmpData = bmp.LockBits(rectImageLockMode.ReadWrite,
                                          PixelFormat.Format24bppRgb);

int stride = bmpData.Stride;
int size = stride * bmp.Height;

unsafe
{
    RGBpRGB = (RGB*)bmpData.Scan0.ToPointer();
    for (int j = 0j < sizej = j + sizeof(RGB))
    {
        byte val = (byte)Math.Round((pRGB->r + pRGB->g + pRGB->b) / 3.0d);
        pRGB->r = val//r
        pRGB->g = val//g
        pRGB->b = val//b
        pRGB++;
    }
}

bmp.UnlockBits(bmpData);
ctlPicture.Image = bmp;


5回の計測の平均値で20.2msでした。Unsafeを使った割にはアレですね。

0 件のコメント: