我有一个List这样
List<Bitmap> imgList = new List<Bitmap>();>
我需要快速浏览该列表并将所有图像拼接成一个。像这样
using (Bitmap b = new Bitmap(imgList[0].Width, imgList[0].Height * imgList.Count, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
{
using (Graphics g = Graphics.FromImage(b))
{
for (int i=0;i<imgList.Count;i++)
{
g.DrawImage(imgList[i], 0, i * imgList[i].Height);
}
}
b.Save(fileName, ImageFormat.Bmp);
}
imgList.Clear()
我遇到的问题是图像是2000宽2高,并且阵列中可能有30,000-100,000个图像。当我尝试制作一个大小的空白位图时,它会得到一个未找到参数的错误。任何帮助都会非常感激。
答案 0 :(得分:1)
您需要的内存块大小为2 x 100,000 x 20,000 x # bytes per pixel
,每像素24位为12,000,000,000字节,每像素32位为16,000,000,000字节。换句话说~12GB或~16GB。对于那么多的内存来说,一个32位的地址空间太小了,所以很糟糕。
或者是吗?
由于您要从中创建文件,因此您应该关注file limits而不是您自己的内存限制。幸运的是,BMP中用于图像尺寸的整数类型的大小是32位,这意味着200,000 x 2,000图像完全在这些限制范围内。因此,无论您是否可以在内存中创建该图像,都可以创建该文件。
这涉及您制作自己版本的BMP编码器。它并没有那么糟糕 - 它最多写一个BMP头,一个DIB头(总共110个字节),然后是原始像素数据。当然,一旦完成,你将很难找到能够打开它的代码,但这是别人的问题,对吗?