我有这个代码通过parallel.for处理图像像素。但是显示了这个错误 "对象目前正在其他地方使用" 请帮我。 谢谢。
Bitmap bmp2 = new Bitmap(openFileDialog1.FileName);
int[,] a = new int[bmp2.Width, bmp2.Height];
Color cc1, cc2, cc3, cc4, cc5, cc6, cc7, cc8, cc9;
pictureBox1.Image = bmp2;
for (int i1 = 2; i1 < bmp2.Width - 2; i1++)
{
System.Threading.Tasks.Parallel.For(2, bmp2.Height - 2, j1 =>
//for (int j1 = 2; j1 < bmp2.Height - 2; j1++)
{
cc1 = bmp2.GetPixel(i1 - 1, j1 - 1);
cc2 = bmp2.GetPixel(i1 - 1, j1);
cc3 = bmp2.GetPixel(i1 - 1, j1 + 1);
cc4 = bmp2.GetPixel(i1, j1 + 1);
cc5 = bmp2.GetPixel(i1 + 1, j1 + 1);
cc6 = bmp2.GetPixel(i1 + 1, j1);
cc7 = bmp2.GetPixel(i1 + 1, j1 - 1);
cc8 = bmp2.GetPixel(i1, j1 - 1);
cc9 = bmp2.GetPixel(i1, j1);
int[] zr = new int[9] { cc1.R, cc2.R, cc3.R, cc4.R, cc5.R, cc6.R, cc7.R, cc8.R, cc9.R };
int[] zg = new int[9] { cc1.G, cc2.G, cc3.G, cc4.G, cc5.G, cc6.G, cc7.G, cc8.G, cc9.G };
int[] zb = new int[9] { cc1.B, cc2.B, cc3.B, cc4.B, cc5.B, cc6.B, cc7.B, cc8.B, cc9.B };
sort(zr);
sort(zg);
sort(zb);
// bmp2.SetPixel(i1, j1, Color.FromArgb(zr[5], zg[5], zb[5]));
});
}
答案 0 :(得分:0)
位图不是线程安全的。好吧,它真的是,因为当你尝试从多个线程访问它时,你会像你一样得到异常。要像从多个线程那样执行操作,请使用LockBits和UnlockBits方法并使用原始数据。
P.S:除此之外,GetPixel 非常慢,所以如果你做任何严肃的事情,无论如何都要避免。