[英](C#) graphics.drawImage has a size limit? How to deal with it?
我试图显示一些数据的非常大的图形表示。 我在我的表单上的 PictureBox 控件的 onPaint 中使用位图来持久存储图像和e.Graphics.DrawImage(myBitmap, new Point(0,0))
。 我注意到(并且在其他网站上听说过)如果我的图像的高度或宽度大于 2^15,我会得到一个Parameter not Valid
异常,但我没有找到任何有关此限制的官方文档。
这个 2^15 的图像大小限制是Graphics.DrawImage
的一个明确的官方部分吗? 是否有任何简单的解决方法可以将我的整个图像渲染到表单上?
(是的,pictureBox 设置为与图像相同的大小,或者更大。不过,附带的问题是,我应该只使用表单本身的 onPaint 而不是图片框吗?)
你这里有几个问题。 首先,如果不将其缩小到适合普通屏幕的尺寸,基本上不可能显示这么大的图像(除非您有某种异常巨大的显示器或多显示器设置)。
您可以使用Graphics.DrawImage
执行此尺寸减小,但请记住,即使使用高质量的InterpolationMode
,插值也最多只能在几个相邻像素上完成,这意味着您可以减少的最大数量是有限的没有严重信息丢失的图像(通常下降到 25%)。
其次,.Net 中的Bitmap
对象比简单的像素数组复杂得多。 位图有时是在视频 RAM 中创建而不是在通用程序内存中创建的,这会更严格地限制它们的最大大小(在紧凑框架中,例如,位图构造函数之一在视频 RAM 中创建像素数据,限制为 4MB 而不是.NET 进程通常可用的 32MB)。 因此,没有记录Bitmap
的最大大小 - 这是一个内部实现细节(也受到任何已经存在的位图的影响),程序员只能通过艰难的方式发现它,如果它太大则抛出异常. 因此,使用Bitmap
存储任意大的数据点集是行不通的。
您最好的方法可能是将您的数据存储为普通的二维数组(可能是int[,]
类型),它可以任意大而不会抛出OutOfMemoryException
(尽管不是让您的计算机变得疯狂交换文件) ,然后编写一个自定义方法,从这个数组复制到一个实际的(和实际大小的) Bitmap
。 然后,您将从该Bitmap
复制到您的PictureBox
(或者,更简单地说,只需将此Bitmap
设置为图片框的Image
属性 - 最好尽可能避免使用Paint
方法)。
在达到此限制之前很久就会遇到问题,大约 10000x10000 像素您将几乎耗尽所有内存用于位图。 考虑到内部 gdi+ 位图将是 32bppargb,根据我的计算,您正在查看每像素 4 个字节 x 100000000 = 4GB。
您应该将图像分解为图块,或者如果您要手动绘制它,请实施分页解决方案。
我已经能够在 64 位应用程序中使用 C# 和 Windows 窗体构建高达 25200 x 15000 像素的位图。 系统有 64 Gig 的 Ram 和 NVIDIA GeForce GTX 1070 和 8GB GDDR5。
我仍在试验,但似乎这是关于位图大小的限制。 我正在将我的应用程序移植到 WPF 并在那里获得了大图像。
确实没有办法在监视器上显示这些图像,但可以将它们保存到文件中并发送到商业印刷商。 我用它来制作生成艺术的高分辨率版画。
在此处查看示例: https ://www.facebook.com/search/top?q=dr%20tom%20fernandez%20art
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.