WPF中的大型位图处理

3
WPF是否能够操作大型位图,而GDI+由于内存限制而无法操作?
我有一些很容易达到10,000x10,000甚至更大的位图。最坏的情况是我可以将单个位图分成大块并进行处理。
我基本上需要做四件事:
1.获取一组平铺图像
2.将所有这些图块放入单个位图中
3.将位图转换为黑白色
4.扫描位图以查找从黑色到白色的变化
我知道如何在GDI+中完成这些任务,但我遇到的问题是我的位图大小对我正在使用的机器来说太大了,导致程序崩溃,而我不能使图像变小,因此我希望WPF能够成功地解决GDI+无法解决的问题。
3个回答

1

我最终决定采取的最佳行动方案是仅与瓦片一起工作,然后有一个数组来保存我需要的每个瓦片的实际信息。鉴于瓦片的数量,这是我唯一明智的选择。


1

我认为WPF在这里无法帮助你。

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

如果您需要,我可以发布代码示例,详细说明如何从位图(无论是WPF还是WinForms)转换为数组并返回。

但请记住,32位.NET应用程序可以使用大约1.2-1.4 GB的内存 - 您必须适应此空间,否则会开始出现OutOfMemory异常。


对于转换为数组,您会使用Lockbits吗?我已经在我的应用程序的一部分中这样做了。 - Aaron M
是的,通过WinForms的LockBits,通过System.Windows.Media.Imaging.BitmapSource的CopyPixels。 - Matěj Zábský

0

就像CommanderZ所说的那样。它是Windows演示基础,而不是Windows图像处理基础。 你应该尝试找到某种图像处理库,但是看着你的图像大小,自己完成可能是唯一的方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接