使用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));
}
}
如果有人能帮助我使程序异步工作,我将非常感激。
基本上你的数据集的并行应该足够大——否则上下文切换的额外成本将使事情变得更慢,而不是更快。
此外,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
,发现在大多数情况下,它只会减慢速度,而不是使它更快。锁位和不安全的代码才是真正的之路。