いくつかの入れ子になったループを高速化するために並列処理を使用しようとしていますが、正しい構文を取得するのに問題があります。ビットマップ内のピクセルが赤、白、または黒のいずれかであるかをカウントしようとしています。これらの値は、他の場所で列挙されています。
シリアル処理では、次のコードがあり、正常に動作します。
Bitmap image = new Bitmap(@"Input.png");
var colourCount = new int[3];
for (var x = 0; x < image.Width; x++)
{
for (var y = 0; y < image.Height; y++)
{
switch (image.GetPixel(x, y).ToArgb())
{
case (int)colours.red: colourCount[0]++; break;
case (int)colours.white: colourCount[1]++; break;
case (int)colours.black: colourCount[2]++; break;
default: throw new ArgumentOutOfRangeException(string.Format("Unexpected colour found: '{0}'", image.GetPixel(x, y).ToArgb()));
}
}
}
以下のような共有変数を更新する Microsoft および Stackoverflow による並列 for ループのコードを見てきました。
Parallel.For<int>(0, result.Count, () => 0, (i, loop, subtotal) =>
{
subtotal += result[i];
return subtotal;
},
(x) => Interlocked.Add(ref sum, x)
);
しかし、すべての例では共有変数として int などの単純な型を使用しているため、サイズ 3 の配列に書き込む構文がわかりません。私はこれにすべて間違って近づいていますか?
ところで、GetPixel は Bitmap.LockBits のようなものに比べてパフォーマンスが非常に遅いことを知っています。並列ループの原理を正しく理解しようとしているだけです。