以前、Unsafeを使わずに配列処理の処理をし画像をグレースケール化するGDD Blog: [.NET]画像処理グレースケール化(1)
GDD Blog: [.NET]画像処理グレースケール化(2) GDD Blog: [.NET]画像処理グレースケール化(3) という記事を書きましたが、パフォーマンスの比較をするためにあえてUnsafeを使ってパフォーマンスを計測してみました。コードはこんな感じ。
5回の計測の平均値で20.2msでした。Unsafeを使った割にはアレですね。
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(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
int stride = bmpData.Stride;
int size = stride * bmp.Height;
unsafe
{
RGB* pRGB = (RGB*)bmpData.Scan0.ToPointer();
for (int j = 0; j < size; j = 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;
//private struct RGB
//{
// public byte b;
// public byte g;
// public byte r;
//}
Bitmap bmp = new Bitmap(ctlPicture.Image);
//bitmapをメモリ上にロックします
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
int stride = bmpData.Stride;
int size = stride * bmp.Height;
unsafe
{
RGB* pRGB = (RGB*)bmpData.Scan0.ToPointer();
for (int j = 0; j < size; j = 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 件のコメント:
コメントを投稿