将数千个位图拼接在一起

时间:2016-10-20 16:29:11

标签: c# bitmap

我有一个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个图像。当我尝试制作一个大小的空白位图时,它会得到一个未找到参数的错误。任何帮助都会非常感激。

1 个答案:

答案 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个字节),然后是原始像素数据。当然,一旦完成,你将很难找到能够打开它的代码,但这是别人的问题,对吗?