同じ古い GDI 手法を使用して C# で画像処理を行い、ネストされた for ループですべてのピクセルを反復処理し、その (ビットマップ) 画像で GetPixel メソッドと SetPixel メソッドを使用しようとしています。
私はすでにポインターアプローチ(安全でないコンテキストを使用)で同じ結果を得ていますが、ビットマップで遊ぶために古い学校のGet / Set-Pixelメソッドを実行しようとしています...
Bitmap ToGrayscale(Bitmap source)
{
for (int y = 0; y < source.Height;y++ )
{
for (int x = 0; x < source.Width; x++)
{
Color current = source.GetPixel(x, y);
int avg = (current.R + current.B + current.G) / 3;
Color output = Color.FromArgb(avg, avg, avg);
source.SetPixel(x, y, output);
}
}
return source;
}
上記のコードのパフォーマンスを考慮すると、1800x1600 の画像の処理が完了するのを待つユーザーにストレスを与えながら、完了するのに時間がかかりすぎます。
そこで、HLSL で使用する手法を使用して、ピクセルごとに個別の関数を実行できると考えました (ピクセル シェーダー エンジン (私が考えていたように) は、float4 (色) を返す関数を GPU に何千回もコピーして、並列処理)。
そこで、ピクセルごとに個別のタスク (関数) を実行して、これらのタスク変数をリストに入れ、List.ToArray() の「待機」を試みました。しかし、次のタスクが実行される前に、すべての新しいタスクが完了するのを「待っている」ため、失敗しました。
これを実行するために、ピクセルごとに新しいタスクを呼び出したいと思いました:
Color current = source.GetPixel(x, y);
int avg = (current.R + current.B + current.G) / 3;
Color output = Color.FromArgb(avg, avg, avg);
source.SetPixel(x, y, output);
一日の終わりに、非同期の非ブロックコードを取得しましたが、並列ではありません...何か提案はありますか?