我正在尝试使用相同的旧 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 一起使用的技术,为每个像素运行一个单独的函数(像素着色器引擎(正如我所认为的那样)在 GPU 上复制返回 float4(颜色)数千次的函数来执行并行处理)。
因此,我尝试为每个像素运行一个单独的任务(函数),将这些任务变量放入一个列表中,并将 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);
在一天结束的时候,我得到了一个异步非阻塞代码,但不是并行的......有什么建议吗?