如何解决C#“参数无效”创建新的位图
| 如果尝试创建大于19000 px的位图,则会出现错误:参数无效。 我该如何解决?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可能拒绝创建同时使用大量连续内存的映像。
稍难阅读,但是此参考资料也有帮助:
http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.drawing/2005-06/msg00176.html
系统中的每个映像都有由以下公式定义的内存量:
bit-depth * width * height / 8
这意味着4050像素乘4050的图像将需要超过660
兆字节的内存。
, 19000像素正方形(32bpp)将需要11552000000位(1.37 GB)将栅格存储在内存中。那只是原始像素数据; System.Drawing.Bitmap中固有的任何其他额外开销都会添加到其中。在相同的色深下,要达到2万像素正方形,仅原始像素内存就需要1.5GB。在单个对象中,您使用的是在32位环境中为整个应用程序保留的空间的3/4。 64位环境通常具有较宽松的限制,但是您仍在使用单个对象最大大小的3/4。
为什么需要如此大的图像尺寸?在计算机监视器上以1280x1024分辨率观看时,侧面19000像素的图像将是14个屏幕宽乘18个屏幕高。我只能想象您正在制作高质量的打印图形,在这种情况下,720dpi的图像将是26英寸的方形海报。
, 我怀疑您正在遇到内存上限问题。但是,位图构造函数可能会失败的原因有很多。这篇知识库文章中列出了主要的内容,其中讨论了CreateBitmap
中的GDI +限制。 System.Drawing.Bitmap
内部在构造位图时使用GDI本机API。
就是说,这种大小的位图恰好超过GB的RAM,很可能您已达到扫描线大小限制(64KB)或内存不足。
, 新建位图时设置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 (\"\");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。