C# WPF中的大型位图编译

C# WPF中的大型位图编译,c#,wpf,C#,Wpf,WPF是否能够在GDI+由于内存限制而无法操作的情况下操作大型位图 我的位图很容易达到10000x1000,甚至可能比这个大得多。最糟糕的情况是,我想我可以将单个位图分解成大的分片,然后使用它 我基本上需要做四件事 拍摄一组平铺图像 将所有这些平铺放在一个位图中 将位图转换为黑白 扫描位图以查找从黑色到白色的更改 我知道如何在GDI+中执行这些操作,但我遇到的问题是,位图的大小对于我正在使用的机器来说太大了,这会导致程序崩溃,并且我无法将图像缩小,所以我希望WPF能够在GDI+让我失望的地方取得

WPF是否能够在GDI+由于内存限制而无法操作的情况下操作大型位图

我的位图很容易达到10000x1000,甚至可能比这个大得多。最糟糕的情况是,我想我可以将单个位图分解成大的分片,然后使用它

我基本上需要做四件事

  • 拍摄一组平铺图像
  • 将所有这些平铺放在一个位图中
  • 将位图转换为黑白
  • 扫描位图以查找从黑色到白色的更改

  • 我知道如何在GDI+中执行这些操作,但我遇到的问题是,位图的大小对于我正在使用的机器来说太大了,这会导致程序崩溃,并且我无法将图像缩小,所以我希望WPF能够在GDI+让我失望的地方取得成功。

    我认为WPF在这方面帮不了你

    为什么要使用位图对象?您也可以使用字节或双字节(或任何其他类型,取决于您需要的精度和范围)的二维数组,特别是如果您仅使用一个通道。位图具有访问器方法(GetPixel等),计算开销巨大,使用数组的速度要快几个数量级(我从个人经验中知道),唯一的问题是无法按原样显示它们(必须将数组转换回图像,这相当简单)。但由于您似乎想对数据进行某种分析,我认为数组将更适合您的需要

    如果需要,我可以发布代码示例,详细说明从位图(WPF或WinForms)到数组的转换


    但是请记住,32位的.NET应用程序可以使用大约1.2-1.4 GB的内存—您必须适应这个空间,否则您将开始摆脱内存异常。

    就像CommanderZ所说的那样。它的Windows演示基础,而不是Windows图像处理基础。 您应该尝试找到某种图像处理库,但查看图像的大小,然后自己做所有事情可能是唯一的方法


    特别是,您可能无法将位图作为一个整体使用,因此您将使用瓷砖。如果需要处理相邻像素,则会出现问题。但我想你应该自己研究一下。

    我最终决定,最好的做法是只使用瓷砖,然后使用一个数组来保存我需要的每个瓷砖的实际信息。考虑到瓷砖的数量,这是我能做的唯一明智的事情

    对于到数组的转换,您会使用锁位吗?我已经在我的部分应用程序中这样做了。是的,通过WinForms的锁位,通过System.Windows.Media.Imaging.BitmapSource的CopyPixels。