用c#创建非常大的位图(大小超过65 535像素)

用c#创建非常大的位图(大小超过65 535像素),c#,C#,我目前正在做一个项目,需要有一个超过80000像素大小的图像。我知道C#中的位图最多只允许65635个宽度 我曾想过使用包含0到255灰度颜色的字节数组,但我不知道如何做到这一点。(当然,图像是灰色的。) 如何生成此类文件/图像并将其保存在我的计算机上以备将来使用 我的解决方案是将图像保存到字节数组数据中,该数据的大小为2147483 648(取决于您使用的是32bpp图像还是8bpp,8bpp的单个图像的像素数可能从2 147 483 648到536 870 912不等。您可能还必须允许gcA

我目前正在做一个项目,需要有一个超过80000像素大小的图像。我知道C#中的位图最多只允许65635个宽度

我曾想过使用包含0到255灰度颜色的字节数组,但我不知道如何做到这一点。(当然,图像是灰色的。)


如何生成此类文件/图像并将其保存在我的计算机上以备将来使用

我的解决方案是将图像保存到字节数组数据中,该数据的大小为2147483 648(取决于您使用的是32bpp图像还是8bpp,8bpp的单个图像的像素数可能从2 147 483 648到536 870 912不等。您可能还必须允许gcAllowVeryLargeObjects为true才能启用该大小的数据。完成后,当您希望将图像显示到自己的查看器/winforms/或类似工具中时,您必须实例化包含多个位图的位图数组,这些位图构成最终图像。我建议使用32 768像素的大图像,因为Graphics.DrawImage只允许您绘制最大32 768像素的图像。

要使用刚刚保存的字节数组创建位图,您必须创建一个具有所需大小的空位图,并使用锁位解锁位将byteArray数据直接设置到位图中。您可以使用类似的方法来完成此工作:

BitmapData bmpData = m_ImageArray[range.Item1].LockBits(new Rectangle(0, 0, m_ImageArray[range.Item1].Width, m_ImageArray[range.Item1].Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
              IntPtr scan = bmpData.Scan0;

              for (int i = 0; i < m_ImageArray[range.Item1].Height; i++)
              {
                 System.Runtime.InteropServices.Marshal.Copy(RawBitmapImage.Data, i * ImageWidth + range.Item1 * firstBitmapWidth, scan, m_ImageArray[range.Item1].Width);
                 scan += bmpData.Stride;
              }

              m_ImageArray[range.Item1].UnlockBits(bmpData);
BitmapData bmpData=m_ImageArray[range.Item1]。锁定位(新矩形(0,0,m_ImageArray[range.Item1]。宽度,m_ImageArray[range.Item1]。高度),ImageLockMode.WriteOnly,PixelFormat.Format8Bppined);
IntPtr scan=bmpData.Scan0;
对于(int i=0;i
上面的代码所做的是将数组的每个位图的位锁定为1×1,从byteArray(RawBitmapImage.data)复制适当的数据块,并使用Marshal.copy将它们复制到作为位图数据指针的扫描中(速度极快,我尝试了图像处理200000像素*5000pixel,加载大约需要200ms

创建完所有位图后,只需对graphicsContext.DrawImage进行多个draw调用,然后逐个将它们绘制出来,并为屏幕指定适当的源和目标


如果您需要任何帮助或任何问题,请随时发表评论!

这可能类似于。仅供参考,数组也不是无限大小的,它们只能通过使用从0开始的有符号整数访问,因此最多可以容纳2147483648个元素。(您还需要设置为true)谢谢!编辑了我的答案!我希望这对将来的其他人有用。