で実験の結果、5回計測で14.420秒となり、約13%の性能向上しました。しかしメモリは画像サイズ分増加します(がいまどきのH/Wであれば知れていますね)。
プログラム言語であるC#にも簡単にマルチスレッドを扱うような機構が用意されており、便利になった反面、マルチスレッドに関する知識もある程度必要と実感しました。
これからのCPUはMoreからManyになる。そういわれています。もっと勉強していかないとね。
で、コードはこんな感じ。
private void btnGlay2_Click(object sender, EventArgs e)
{
textBox1.Text = "グレースケール化(2)";
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
Bitmap bmp = new Bitmap(ctlPicture.Image);
int h = bmp.Height;
int w = bmp.Width;
Parallel.For(0, w, delegate(int i)
{
for (int j = 0; j < h; j++)
{
Color color;
lock (bmp)
{
color = bmp.GetPixel(i, j);
// 計算式にて、値を算出してセットする
//int col = (int)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114);
//int col = (int)((color.R + color.G + color.B) / 3);
int col = (int)Math.Round((color.R + color.G + color.B) / 3.0d);
Color pix = Color.FromArgb(col, col, col);
bmp.SetPixel(i, j, pix);
}
}
});
ctlPicture.Image = bmp;
sw.Stop();
textBox1.Text = String.Format(textBox1.Text + " 完了{0:#,##0}ms", sw.ElapsedMilliseconds);
}
{
textBox1.Text = "グレースケール化(2)";
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
Bitmap bmp = new Bitmap(ctlPicture.Image);
int h = bmp.Height;
int w = bmp.Width;
Parallel.For(0, w, delegate(int i)
{
for (int j = 0; j < h; j++)
{
Color color;
lock (bmp)
{
color = bmp.GetPixel(i, j);
// 計算式にて、値を算出してセットする
//int col = (int)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114);
//int col = (int)((color.R + color.G + color.B) / 3);
int col = (int)Math.Round((color.R + color.G + color.B) / 3.0d);
Color pix = Color.FromArgb(col, col, col);
bmp.SetPixel(i, j, pix);
}
}
});
ctlPicture.Image = bmp;
sw.Stop();
textBox1.Text = String.Format(textBox1.Text + " 完了{0:#,##0}ms", sw.ElapsedMilliseconds);
}
0 件のコメント:
コメントを投稿