访问冲突异常保存位图

时间:2018-07-12 20:47:30

标签: c# gdi+

我收到以下异常:

引发异常:

'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;*/
    }

0 个答案:

没有答案