gpt4 book ai didi

c# - 使用 C# 5.0 进行并行图像处理

转载 作者:太空宇宙 更新时间:2023-11-03 20:13:29 25 4
gpt4 key购买 nike

我正在尝试使用 C# 使用相同的旧 GDI 技术进行一些图像处理,使用嵌套的 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);

在一天结束的时候,我得到了一个异步非阻塞代码但不是并行的......大家有什么建议吗?

最佳答案

GetPixelSetPixel 可能是这里的主要瓶颈。

与其尝试并行化,我建议使用 Bitmap.LockBits更有效地处理解析。

也就是说,您可以通过以下方式并行化当前版本:

Bitmap ToGrayscale(Bitmap source)
{
Parallel.For(0, 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;
}

但是,Bitmap 类不是线程安全的,因此这可能会导致问题。

更好的方法是使用 LockBits,然后直接并行处理原始数据(如上所述)。请注意,我只是(有意)并行化了外部循环,因为这将防止内核因工作项而过度饱和。

关于c# - 使用 C# 5.0 进行并行图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18369823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com