C# "参数无效" 创建新位图

38

如果我尝试创建一个大于19000像素的位图,会出现错误:参数无效。有什么解决方法吗?

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

3
需要指定较小的像素格式吗?默认值为32bpp。 - Rup
5个回答

40
请记住,您正在尝试使用该位图分配大量内存。

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

.NET 可能拒绝一次性创建使用这么多连续内存的图像。

虽然阅读起来稍微有些困难,但以下参考也会有所帮助:

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

位深度 * 宽度 * 高度 / 8

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


8

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

为什么您需要如此巨大的图像尺寸?在计算机显示器上以1280x1024分辨率查看,一侧为19000像素的图像将宽14屏,高18屏。我只能想象您正在进行高质量的印刷图形处理,在这种情况下,720dpi的图像将成为一个26英寸的正方形海报。


9
为什么你需要如此庞大的图像尺寸?可能原因是:他想要将图像文件加载到位图对象中,然后将其缩小。 - Doug S
12
2019年的来电。现在看起来规模小了一些 - 让我们看看2026年会怎样。 - Martin Capodici
7
2020 年的呼叫。我的笔记本电脑有 32GB 的内存,我想好好利用它。 - Pangamma
7
2021 年的呼叫。仍处于隔离中。 - rhys_stubbs
2023年即将结束。已经解除隔离一段时间了,但是不,那仍然是一个巨大的图像尺寸。 - undefined

7

在新建位图时,设置像素格式,例如:

new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555)

使用上述确切的数字,对我来说是可行的。这可能在一定程度上解决了问题。


6
我猜测你遇到了内存容量问题。但是,位图构造器失败的原因有很多。主要原因是在CreateBitmap中GDI+限制。在位图构造时,System.Drawing.Bitmap内部使用GDI本地API。

话虽如此,这种大小的位图已经超过1GB的RAM,很可能你会遇到扫描线大小限制(64KB)或内存不足的情况。


0

打开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 ("");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接