C#“参数无效”。创建新的位图

时间:2011-06-13 17:03:24

标签: c# parameters bitmap size

如果我尝试创建一个大于19000像素的位图,我会收到错误:参数无效。 我该如何解决这个问题?

System.Drawing.Bitmap myimage= new System.Drawing.Bitmap(20000, 20000);

5 个答案:

答案 0 :(得分:31)

请记住,这是您尝试使用该位图分配的大量内存。

请参阅http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/37684999-62c7-4c41-8167-745a2b486583/

.NET很可能拒绝创建一次占用大量连续内存的图像。

稍微难以阅读,但此参考也有帮助:

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.drawing/2005-06/msg00176.html

  

系统中的每个图像都有此公式定义的内存量:

     

bit-depth * width * height / 8

     

这意味着图像40800像素乘4050将需要超过660   兆字节的内存。

答案 1 :(得分:7)

19000像素的正方形,32bpp,需要11552000000位(1.37 GB)才能将光栅存储在内存中。那只是原始像素数据; System.Drawing.Bitmap中固有的任何额外开销都会增加。在相同颜色深度上达到20k像素的正方形,仅需要1.5GB的原始像素存储器。在单个对象中,您在32位环境中使用为整个应用程序保留的3/4空间。 64位环境具有更宽松的限制(通常),但您仍然使用单个对象的最大大小的3/4。

为什么你需要如此庞大的图像尺寸?在计算机显示器上观看1280x1024 res,一侧19000像素的图像宽14屏,高18屏。我只能想象你正在制作高质量的印刷图形,在这种情况下720dpi图像将是一张26“方形的海报。

答案 2 :(得分:6)

我怀疑你遇到了内存上限问题。但是,位图构造函数可能会失败的原因有很多。主要问题列在this Knowledge Base article中,讨论CreateBitmap中的GDI +限制。内部System.Drawing.Bitmap在构造位图时使用GDI本机API。

话虽这么说,这个大小的位图远远超过GB的RAM,并且你可能要么达到扫描线大小限制(64KB)或内存不足。

答案 3 :(得分:3)

在新位图时设置PixelFormat,例如:

new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555)

并且上面的确切数字对我有用。这可能部分解决了这个问题。

答案 4 :(得分:0)

打开TIF文件时出现此错误。问题是由于无法打开CMYK。将颜色空间从RGB更改为CMYK并且没有出错。

所以我使用taglib库来获取图像文件大小。

代码示例:

UTF-8 with BOM