WPF中的大位图操作

时间:2010-12-30 04:57:08

标签: c# wpf

WPF是否能够操作GDI +因内存限制而无法处理的大位图?

我的位图容易10,000x10,000,甚至可能比这大得多。最糟糕的情况我认为我可以将单个位图分解为大块,并且我可以使用它。

我基本上需要做四件事

  1. 拍摄一组平铺图像
  2. 将所有这些图块放入单个位图
  3. 将位图转换为黑白
  4. 扫描位图,查找从黑色到白色的更改
  5. 我知道如何在GDI +中执行这些操作,但我遇到的问题是我的位图的大小对于我正在使用的机器而言太大,并且它导致程序崩溃,我无法使任何更小的图像,所以我希望WPF能够在GDI +失败的地方取得成功。

3 个答案:

答案 0 :(得分:1)

我认为WPF无法在这里为您提供帮助。

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

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

但请记住,32位.NET应用程序可以使用大约1.2-1.4千兆字节的内存 - 您必须适应这个空间或者开始获得OutOfMemory异常。

答案 1 :(得分:1)

我最终决定最好的做法是仅使用磁贴,然后有一个数组,其中包含我需要的每个磁贴的实际信息。鉴于瓷砖的数量,这是我能做的唯一明智的事情。

答案 2 :(得分:0)

像CommanderZ说的那样。它的Windows PRESENTATION Foundation,而不是Windows Image-manipulation Foundation。 您应该尝试找到某种图像处理库,但要查看图像的大小,然后自己做一切可能只是方法。

特别是,您可能无法使用位图作为一个整体,因此您将使用磁贴。然后,如果您需要使用相邻像素,则会出现问题。但我想你应该亲自调查一下。