使用parallel访问图像的每个像素.使用

本文关键字:使用 像素 图像 parallel 访问 | 更新日期: 2023-09-27 18:08:45

所以,我正在做一个c#项目,应该将图像逐像素复制到另一个图像变量中。我写了代码,它工作正常,但它有点太慢了。现在我正试图使代码与并行异步工作。For,但是我正在努力锁定在循环中更改的变量,并且它总是抛出异常。

所以,这是我的初始代码(我知道这样的程序没有多大意义,但它只是一个简单的例子):
Bitmap loadedImage = new Bitmap(filename);
var newImage = new Bitmap(loadedImage.Width, loadedImage.Height);
Color color = new Color();
byte r, g, b;
for (int i = 0; i < loadedImage.Height; i++)
{
    for (int j = 0; j < loadedImage.Width; j++)
    {
        color = loadedImage.GetPixel(j, i);
        r = color.R;
        g = color.G;
        b = color.B;
        newImage.SetPixel(j, i, Color.FromArgb(r, g, b));
    }
}

如果有人能帮助我使程序异步工作,我将非常感激。

使用parallel访问图像的每个像素.使用

基本上你的数据集的并行应该足够大——否则上下文切换的额外成本将使事情变得更慢,而不是更快。

此外,lockbits将使事情比使用GetPixel快得多。

也就是说,实现非常简单:

Bitmap loadedImage = new Bitmap(filename); 
var newImage = new Bitmap(loadedImage.Width, loadedImage.Height);
// don't create variables here...
Parallel.For(0, loadedImage.Height, (i) =>
    {
        for (int j = 0; j < loadedImage.Width; j++)
        {
            // but here -- that's better for a lot of reasons.
            var color = loadedImage.GetPixel(j, i);
            var r = color.R;
            var g = color.G;
            var b = color.B;
            newImage.SetPixel(j, i, Color.FromArgb(r, g, b));                    
        }
    });

只要数据中没有重叠,这就可以工作。在我的情况下没有。

PS:我过去一直在处理照片和Parallel.For,发现在大多数情况下,它只会减慢速度,而不是使它更快。锁位和不安全的代码才是真正的之路。