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一个同时使用多个连续内存的映像。
稍微难以阅读,但这个参考也有帮助:
系统中的每个图像都有由此公式定义的内存量。
位深度宽度高度/ 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 (""); } }