我在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。最后一切都正常了:)。
所有问题都解决了,我的迷宫发生器启动并运行。谢谢大家:)
答案 0 :(得分:3)
如果你的迷宫只是黑/白,你可能想尝试:
Bitmap bitmap = new Bitmap(16000, 16000, PixelFormat.Format1bppIndexed);
假设它将图像保留在内存中,那应该比默认像素格式更有效。
在我的盒子上(默认情况下有12GB的内存),16000x16000默认工作,但32000x32000没有。甚至32000x32000也适用于Format1bppIndexed
。
编辑:如评论中所述,您应该对位图使用using
语句:
using (Bitmap bitmap = ...)
{
}
......以便可以适当地清理它们。