拼接在一起数以千计的位图

本文关键字:位图 数以千计 在一起 拼接 | 更新日期: 2023-09-27 18:13:57

我有一个这样的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图像在数组中。当我尝试制作空白位图时,它会得到一个参数未找到错误。如有任何帮助,不胜感激。

拼接在一起数以千计的位图

您需要的内存块的大小是2 x 100,000 x 20,000 x # bytes per pixel,它将是12,000,000,000字节(每像素24位)和16,000,000,000字节(每像素32位)。换句话说就是~12GB或~16GB。32位的地址空间对于这么多的内存来说实在是太小了,对你来说太糟糕了。

是吗?

因为你想从这个文件创建一个文件,你应该关心文件限制而不是你自己的内存限制。幸运的是,BMP中用于图像尺寸的整数类型的大小是32位,这意味着200,000 x 2,000的图像完全在这些限制之内。所以无论你是否可以在内存中创建图像,你都可以创建文件

这涉及到您制作自己版本的BMP编码器。这并没有那么糟糕——它主要是写一个BMP报头,一个DIB报头(总共110字节),然后是原始像素数据。当然,一旦完成,您将很难找到打开它的代码,但这是其他人的问题,对吧?