繁体   English   中英

(C#) graphics.drawImage 有大小限制吗? 如何处理?

[英](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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM