4

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

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

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

4

3 回答 3

5

你这里有几个问题。首先,如果不将其缩小到适合普通屏幕的尺寸,基本上不可能显示这么大的图像(除非您有某种异常巨大的显示器或多显示器设置)。

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

其次,Bitmap.Net 中的对象比简单的像素数组复杂得多。位图有时是在视频 RAM 中创建而不是在通用程序内存中创建的,这会更严格地限制它们的最大大小(在紧凑框架中,例如,位图构造函数之一在视频 RAM 中创建像素数据,限制为 4MB 而不是.NET 进程通常可用的 32MB)。因此,没有记录 a 的最大大小Bitmap- 这是一个内部实现细节(也受到任何已经存在的位图的影响),程序员只能通过艰难的方式发现它,如果它太大则抛出异常。因此,使用 aBitmap存储任意大的数据点集是行不通的。

你最好的方法可能是将你的数据存储为一个普通的二维数组(类型int[,]可能),它可以任意大而不会抛出一个OutOfMemoryException(尽管不是让你的计算机变得疯狂交换文件),然后写一个从此数组复制到实际(和实际大小)的自定义方法Bitmap。然后,您将从这里复制Bitmap到您的PictureBox(或者,更简单地说,只是将其设置Bitmap为图片框的Image属性 - 最好尽可能避免使用该Paint方法)。

于 2010-06-18T14:29:51.960 回答
2

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

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

于 2010-04-07T23:16:48.097 回答
1

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

于 2015-03-06T18:54:17.310 回答