我收到以下异常:
引发异常:
'System.AccessViolationException' in System.Drawing.dll
调用位图的保存功能时。该过程在第一次运行时运行良好,但随后的调用将引发此异常。
我的应用程序拍摄单个长图像并将其垂直平铺为几个单独的图像。为此,我首先将整个图像分解为字节,然后在Parallel.For循环中,从子集字节数组生成位图。
// Generate Bitmap from width, height and bytes
private Bitmap GenerateBitmap(int width, int height, byte[] bytes)
{
Bitmap bmp = new Bitmap(width, height, Stride(width),
PixelFormat.Format8bppIndexed,
Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0));
bmp.SetPalette();
return bmp;
}
这是位图生成例程。
这是调用它的循环体。
Parallel.For(0, tileCount, i =>
{
byte[] bytes = new byte[imageWidth * tileHeight];
for (int j = 0; j < bytes.Length; j++)
{
bytes[j] = imageBytes[j + (imageWidth * (tileHeight * i))];
}
arr[i] = GenerateBitmap(imageWidth, tileHeight, bytes);
});
这是引发异常的其他代码。
foreach(Bitmap tile in pattern.Tiles)
{
Console.WriteLine("Creating Tile " + count);
using (Bitmap bmp = new Bitmap(tile))
{
bmp.Save(Globals.patternOutputPath + "tile_" + count + ".png");
}
count += 1;
}
“图块”是模式的属性,该模式调用for循环函数(该函数返回位图列表)。
我想我在这里的某个地方缺少一些清理工作。
其他信息:所有图像(输入和输出)均为256(索引)颜色格式。
编辑:以下评论解决了当前的问题,我认为我已经解决了这个问题。我将GenerateBitmap例程更改为以下内容,并且不再遇到此异常,但是我需要做更多的测试。
private Bitmap GenerateBitmap(int width, int height, byte[] bytes)
{
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
Marshal.Copy(bytes, 0, bmpData.Scan0, bytes.Length);
bmp.UnlockBits(bmpData);
return bmp;
/*Bitmap bmp = new Bitmap(width, height, Stride(width),
PixelFormat.Format8bppIndexed,
Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0));
bmp.SetPalette();
return bmp;*/
}