gpt4 book ai didi

c# - Parallel.For 语句返回 "System.InvalidOperationException"带位图处理

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:49 26 4
gpt4 key购买 nike

好吧,我有一个在“x”图像中应用 Rain Bow 滤镜的代码,我必须通过两种方式进行:顺序和并行,我的顺序代码工作没有问题,但并行部分不起作用。我不知道,为什么?

代码

public static Bitmap RainbowFilterParallel(Bitmap bmp)
{

Bitmap temp = new Bitmap(bmp.Width, bmp.Height);
int raz = bmp.Height / 4;

Parallel.For(0, bmp.Width, i =>
{
Parallel.For(0, bmp.Height, x =>
{

if (i < (raz))
{
temp.SetPixel(i, x, Color.FromArgb(bmp.GetPixel(i, x).R / 5, bmp.GetPixel(i, x).G, bmp.GetPixel(i, x).B));
}
else if (i < (raz * 2))
{
temp.SetPixel(i, x, Color.FromArgb(bmp.GetPixel(i, x).R, bmp.GetPixel(i, x).G / 5, bmp.GetPixel(i, x).B));
}
else if (i < (raz * 3))
{
temp.SetPixel(i, x, Color.FromArgb(bmp.GetPixel(i, x).R, bmp.GetPixel(i, x).G, bmp.GetPixel(i, x).B / 5));
}
else if (i < (raz * 4))
{
temp.SetPixel(i, x, Color.FromArgb(bmp.GetPixel(i, x).R / 5, bmp.GetPixel(i, x).G, bmp.GetPixel(i, x).B / 5));
}
else
{
temp.SetPixel(i, x, Color.FromArgb(bmp.GetPixel(i, x).R / 5, bmp.GetPixel(i, x).G / 5, bmp.GetPixel(i, x).B / 5));
}

});

});
return temp;
}

此外,稍后程序会返回相同的错误,但显示“该对象已在使用中”。

附言。我是 c# 的初学者,我在另一篇文章中搜索了这个主题,但一无所获。

非常感谢您

最佳答案

正如评论者 Ron Beyer 指出的那样,使用 SetPixel()GetPixel() 方法非常慢。每次调用这些方法中的一个时,在托管代码到 Bitmap 对象表示的实际二进制缓冲区之间的转换过程中都会产生很多开销。那里有很多层,通常涉及视频驱动程序,这需要在用户级和内核级执行之间进行转换。

但是除了速度慢之外,这些方法还会使对象“忙碌”,因此如果在调用其中一个方法和返回之间尝试使用位图(包括调用其中一个方法) (即,当通话正在进行时)发生错误,出现您看到的异常。

由于并行化当前代码的唯一方法是如果这些方法调用可以并发发生,并且由于它们根本不能同时发生,所以这种方法行不通。

另一方面,使用 LockBits() 方法不仅可以保证有效,而且很有可能您会发现使用 LockBits() 的性能要好得多 你甚至不需要并行化算法。但是如果您决定这样做,因为 LockBits() 的工作方式——您可以访问表示位图图像的原始字节缓冲区——您可以轻松地并行化算法并利用多个 CPU核心(如果存在)。

请注意,在使用 LockBits() 时,您将在您可能不习惯的级别上使用 Bitmap 对象。如果您还不了解位图的“幕后”工作原理,您将不得不熟悉位图实际存储在内存中的方式。这包括了解不同像素格式的含义,如何解释和修改给定格式的像素,以及位图在内存中的布局方式(例如,行的顺序可能因位图而异,以及“位图的步幅”)。

这些东西学起来并不难,但需要耐心。不过,如果性能是您的目标,那么付出努力是值得的。

关于c# - Parallel.For 语句返回 "System.InvalidOperationException"带位图处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30009297/

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