C#“参数无效”,创build新的位图

如果我尝试创build大于19000像素的位图,则会显示以下错误:参数无效。 我该如何解决这个问题?

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

请记住,这是你正试图分配与该位图很多的内存。

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

.NET很可能会拒绝创build一个同时使用多个连续内存的映像。

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

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

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

位深度宽度高度/ 8

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

我怀疑你正在遇到内存上限问题。 但是,位图构造函数可能会失败的原因很多。 主要的是在这篇知识库文章中讨论了CreateBitmap GDI +限制。 System.Drawing.Bitmap内部, System.Drawing.Bitmap在构造位图时使用GDI本地API。

这就是说,这个尺寸的位图远远超过了GB的RAM,而且很可能是扫描线大小限制(64KB)或内存不足。

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

为什么你需要这么庞大的图像尺寸? 在电脑显示器上以1280×1024的分辨率观看,一面19000像素的图像将是14屏幕宽18屏幕高。 我只能想象你正在做高质量的打印graphics,在这种情况下,一张720dpi的图像将是一张26平方的海报。

当您新build一个位图时设置PixelFormat,如:

 new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555) 

和上面的确切数字,它适用于我。 这可能部分解决了这个问题。

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

所以我用taglib库来取代图像文件的大小。

代码示例:

 try { var image = new System.Drawing.Bitmap(filePath); return string.Format("{0}px by {1}px", image.Width, image.Height); } catch (Exception) { try { TagLib.File file = TagLib.File.Create(filePath); return string.Format("{0}px by {1}px", file.Properties.PhotoWidth, file.Properties.PhotoHeight); } catch (Exception) { return (""); } }