处理大图像时的例外情况

时间:2012-01-17 20:51:46

标签: c# image memory bitmap overflow

我在C#中使用迷宫生成器生成大型迷宫,然后将它们保存到png文件中。

目前,当我尝试保存图片时,我遇到了一些错误。

当我使用它时:

System.Drawing.Bitmap tempBitmap = new System.Drawing.Bitmap(16000, 16000);

我得到一个参数异常。 (它适用于8000 * 8000)

当我使用WPF方式时:

RenderTargetBitmap rtb = 
              new RenderTargetBitmap(16000, 16000, 96, 96, PixelFormats.Pbgra32);

我遇到内存溢出异常。

有没有人有另一种方法可以在c#中保存大图片?

我也看了一些图书馆但没有成功。

有人还说我应该首先将图像保存在部分中,然后将它们合并,但我该怎么办呢?

编辑:

EDIT2: 我现在正在尝试像这样的PixelFormat.Format1bppIndexed:

private Bitmap CreateBitmapImage2(BitArray[] map, List<Point> path)
{
    Bitmap objBmpImage = new Bitmap(cursize * (map[0].Length - 1), cursize * (map.Length - 1), PixelFormat.Format1bppIndexed);

    Rectangle rect = new Rectangle(0, 0, objBmpImage.Width, objBmpImage.Height);
    System.Drawing.Imaging.BitmapData bmpData =
        objBmpImage.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
        objBmpImage.PixelFormat);

    IntPtr ptr = bmpData.Scan0;

    int bytes = Math.Abs(bmpData.Stride) * objBmpImage.Height;
    byte[] rgbValues = new byte[bytes];

    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

    int counter = 0;
    int counterdeluxe = 0;
    BitArray bitarray = new BitArray(8);

    Random r = new Random();

    Boolean last = true;
    for (int i = 0; i < 225 / 8; i++)
    {
        rgbValues[i] = (byte)r.Next(255);
    }

    System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);


    objBmpImage.UnlockBits(bmpData);

    return (objBmpImage);
}

虽然由于某种原因它只创建了一半图像: http://dl.dropbox.com/u/1814002/maze.png

Edit4: 啊似乎宽度中的位总是四舍五入到4字节的数字。现在它开始对我有意义了:)。

Edit5: 好吧,它再也没有意义了,我现在只是留在图形中我猜

Edit6: 我不能放手让我再看一遍,发现以下内容: 在我使用BitArray将我的单独位转换为一个字节然后写入ImageData的地方出错的时候,显然必须反过来写入bitarray。最后一切都正常了:)。

所有问题都解决了,我的迷宫发生器启动并运行。谢谢大家:)

1 个答案:

答案 0 :(得分:3)

如果你的迷宫只是黑/白,你可能想尝试:

Bitmap bitmap = new Bitmap(16000, 16000, PixelFormat.Format1bppIndexed);

假设它将图像保留在内存中,那应该比默认像素格式更有效。

在我的盒子上(默认情况下有12GB的内存),16000x16000默认工作,但32000x32000没有。甚至32000x32000也适用于Format1bppIndexed

编辑:如评论中所述,您应该对位图使用using语句:

using (Bitmap bitmap = ...)
{
}

......以便可以适当地清理它们。