图像无法在 Parallel.For 循环中保存
Image fails to save in Parallel.For loop
我正在使用 Parallel.For 循环来处理一些图像。当我尝试保存图像时,有时会出现异常-
a generic error occurred in gdi+
一些图像被保存,然后在保存少量文件后随机出现此异常。
- 我尝试将原始位图图像对象分配给不同的位图图像,然后保存它
- 尝试使用
Monitor.Enter
在保存文件之间进行同步
下面是我的代码-
Parallel.For(0, 14, cnt =>
{
using (Bitmap originalImage = (Bitmap)Bitmap.FromFile(@imagePath))
{
for (int i = 0; i < originalImage.Width; i++)
{
for (int x = 0; x < originalImage.Height; x++)
{
System.Drawing.Color oc = originalImage.GetPixel(i, x);
int gray = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
System.Drawing.Color nc = System.Drawing.Color.FromArgb(oc.A, gray, gray, gray);
originalImage.SetPixel(i, x, nc);
}
}
try
{
//Bitmap grayscaleImage = originalImage;
//grayscaleImage.Save(@processesImagesPath + DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") + ".jpg"); //line of exception
//above lines did not work
Monitor.Enter(originalImage);
originalImage.Save(@processesImagesPath + DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") + ".jpg"); //line of exception
}
finally
{
Monitor.Exit(originalImage);
}
}
});
DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss")
- 一秒钟可以保存两张图片,你会得到一个错误。创建更独特的文件名。
例如:
var filename = DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") + cnt
我正在使用 Parallel.For 循环来处理一些图像。当我尝试保存图像时,有时会出现异常-
a generic error occurred in gdi+
一些图像被保存,然后在保存少量文件后随机出现此异常。
- 我尝试将原始位图图像对象分配给不同的位图图像,然后保存它
- 尝试使用
Monitor.Enter
在保存文件之间进行同步
下面是我的代码-
Parallel.For(0, 14, cnt =>
{
using (Bitmap originalImage = (Bitmap)Bitmap.FromFile(@imagePath))
{
for (int i = 0; i < originalImage.Width; i++)
{
for (int x = 0; x < originalImage.Height; x++)
{
System.Drawing.Color oc = originalImage.GetPixel(i, x);
int gray = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
System.Drawing.Color nc = System.Drawing.Color.FromArgb(oc.A, gray, gray, gray);
originalImage.SetPixel(i, x, nc);
}
}
try
{
//Bitmap grayscaleImage = originalImage;
//grayscaleImage.Save(@processesImagesPath + DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") + ".jpg"); //line of exception
//above lines did not work
Monitor.Enter(originalImage);
originalImage.Save(@processesImagesPath + DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") + ".jpg"); //line of exception
}
finally
{
Monitor.Exit(originalImage);
}
}
});
DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss")
- 一秒钟可以保存两张图片,你会得到一个错误。创建更独特的文件名。
例如:
var filename = DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") + cnt