如果我尝试创建一个大于19000像素的位图,会出现错误:参数无效。有什么解决方法吗?
System.Drawing.Bitmap myimage= new System.Drawing.Bitmap(20000, 20000);
如果我尝试创建一个大于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 可能拒绝一次性创建使用这么多连续内存的图像。
虽然阅读起来稍微有些困难,但以下参考也会有所帮助:
系统中每个图像的内存量由此公式定义:
位深度 * 宽度 * 高度 / 8
这意味着,一个40800像素乘4050像素的图像将需要超过660兆字节的内存。
在32bpp下,19000像素的正方形需要占用11552000000位(1.37GB)的内存来存储光栅图像。这只是原始像素数据;任何固有于System.Drawing.Bitmap中的额外开销都会增加到其中。在相同颜色深度下将大小提升到20k像素的正方形将需要1.5GB的原始像素内存。在单个对象中,您使用了32位环境中整个应用程序保留的3/4空间。64位环境具有更宽松的限制(通常),但您仍然使用了单个对象的最大尺寸的3/4。
为什么您需要如此巨大的图像尺寸?在计算机显示器上以1280x1024分辨率查看,一侧为19000像素的图像将宽14屏,高18屏。我只能想象您正在进行高质量的印刷图形处理,在这种情况下,720dpi的图像将成为一个26英寸的正方形海报。
在新建位图时,设置像素格式,例如:
new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555)
使用上述确切的数字,对我来说是可行的。这可能在一定程度上解决了问题。
CreateBitmap
中GDI+限制。在位图构造时,System.Drawing.Bitmap
内部使用GDI本地API。
话虽如此,这种大小的位图已经超过1GB的RAM,很可能你会遇到扫描线大小限制(64KB)或内存不足的情况。
打开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 ("");
}
}