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

DGH*_*DGH 4 c# windows graphics onpaint

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

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

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

Mus*_*sis 5

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

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

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

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