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

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

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

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

解决方法:

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

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

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

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

上一篇:020_JDK8.0新特性<四>StreamAPI_1_StreamAPI概述


下一篇:java8新特性(二)StreamApi