(C#)graphics.drawImage有大小限制吗?怎么处理呢?

时间:2010-04-07 22:53:20

标签: c# windows graphics onpaint

我试图显示某些数据的非常大的图形表示。我正在使用位图来持久存储图像,并在我的表单上的PictureBox控件的onPaint上使用e.Graphics.DrawImage(myBitmap, new Point(0,0))。我注意到(并在其他网站上提到过)如果我的图片的高度或宽度大于2 ^ 15,我会得到Parameter not Valid例外,但我没有找到任何关于此限制的官方文档。

这个2 ^ 15的图像大小限制了Graphics.DrawImage的明确官方部分吗?是否有任何简单的解决方法可以将整个图像渲染到表单上?

(是的,pictureBox被设置为与图像相同的大小,或更大。但问题是,我应该只使用表单的onPaint而不是图片框吗?)

3 个答案:

答案 0 :(得分:5)

这里有一些问题。首先,从根本上不可能显示这么大的图像(除非你有一些非常庞大的显示器或多个显示器设置),而不是将其缩小到适合普通屏幕的尺寸。

您可以使用Graphics.DrawImage执行此尺寸缩减,但请记住,即使使用高质量的InterpolationMode,插值也只能在最多几个相邻像素上进行,这意味着在没有严重信息丢失的情况下减少图像的最大量限制(通常低至25%)。

其次,.Net中的Bitmap对象比简单的像素数组复杂得多。位图有时是在视频RAM而不是通用程序存储器中创建的,这会更严重地限制它们的最大尺寸(在紧凑的框架中,作为一个示例,其中一个位图构造器在视频RAM中创建像素数据,限制为4MB而不是通常可用于.NET进程的32MB)。因此,Bitmap没有文档的最大大小 - 这是一个内部实现细节(受到任何现有位图的影响),程序员只能通过获取抛出的异常来发现困难的方法如果它太大了因此,使用Bitmap来存储任意大量的数据点是行不通的。

这里你最好的方法可能是将你的数据存储为普通的二维数组(可能是int[,]类型),这可能是任意大的而不会抛出OutOfMemoryException(尽管不是没有)让你的计算机去掉swapfile-crazy),然后编写一个自定义方法,从这个数组复制到一个实际的(和实际大小的)Bitmap。然后,您可以将此Bitmap复制到PictureBox(或者更简单地说,只需将此Bitmap设置为图片框的Image属性 - 最好避免Paint 1}}方法尽可能)。

答案 1 :(得分:2)

在达到此限制之前很久就会遇到问题,大约10000x10000像素,您将占用几乎所有内存用于位图。考虑内部gdi +位图将是32bppargb,你看我的每个像素4个字节x 100000000 = 4GB我的计算。

您应该将图像分解为图块,或者如果您正在绘制图像,请手动实现分页解决方案。

答案 2 :(得分:1)

我已经能够在64位应用程序中使用C#和Windows窗体构建高达25200 x15000像素的位图。我还在尝试,但似乎这是关于位图大小的限制。