图像处理是一个充满惊喜和挑战的领域。本文将介绍一个使用C#和WPF开发的图像处理工具,该工具能够将图像与自身模糊的副本进行混合,同时保持代码的简洁性。性能监控是该工具的一大特色,它允许用户实时查看处理效果。如果对图像处理感兴趣,或者想了解一些常见的混合模式及其定义,那么这个工具可能会吸引。虽然UI设计并非遵循严格的设计原则,但它的娱乐价值或许能弥补这一点。
这个工具的核心功能是将图像与其模糊副本进行混合。用户可以指定模糊的程度(以像素为单位,范围是0到50),以及需要模糊的RGB通道。工具支持29种常见的混合模式,其中“正常”模式相当于无操作。工具界面是一个可调整大小的窗口,窗口大小变化时,输出图像也会相应调整大小。缩放功能可以显示图像的压缩或拉伸百分比,100%表示图像以实际大小显示。性能信息会在文本框中显示,包括模糊程度、C#垃圾回收堆的内存大小以及5个关键方法使用的毫秒数。这些信息可以通过滚动查看。
图像数据会占用大量的内存。一个10MB的图像需要40MB的内存来存储alpha、红色、绿色和蓝色通道。这个工具在执行工作时会使用图像数据的多个副本,这些副本被分配在大对象堆(LOH)上。在32位机器上进行测试时,随机遇到了内存不足的异常。有时可以整天运行而不重现问题,而有时工具一开始就无法使用。重新编译为64位可以消除异常,但并没有改善内存使用情况。GC内存观察到会随机翻倍,从未确定问题的原因。为了解决这个问题,使用了一个固定大小的LohRgbArray类来存储所有图像数据。使用其默认大小,可以存储任何大小的图像。LohRgbArray的实例在启动时分配,并且永远不会被释放。工具会重用它们来加载任何图像,无论其大小如何。不幸的是,这限制了可以加载的最大图像大小。然而,工具在32位机器上不再出现内存不足的问题。
在合适的图像大小上进行交互式图像处理需要在很短的时间内消耗大量的CPU资源。当WPF滑块被拖动时,图像应该至少每秒更新10次,以避免让用户感到沮丧。当执行复杂的图像操作时,尤其是使用工具中提供的模糊方法时,很难达到这种性能。它的CPU使用率随着图像大小的平方增加。在图像大小超过一定大小时使用它并不令人愉快。像Photoshop这样的程序通过使用OpenCL在GPU上运行图像处理代码来解决这个问题。这很复杂,很难在任何GPU上完成,并且会减少尝试算法的乐趣。这里采取的方法是使用多个CPU核心来快速执行处理,以适应屏幕上的图像。体验可能会根据CPU而有所不同。避免调整C#,尝试的优化加速了一个CPU,但减慢了另一个。
这个工具支持一些最知名和一些不常见的混合模式。请记住,混合模式没有官方定义。有疑问时,可以与Photoshop进行比较。这个工具可以用作开发新混合模式的框架。可以自由地尝试任何能想到的混合模式。请记住,为了让混合模式被接受,它应该是平滑的。如果它有突然的跳跃,它的使用将会被抵制。一些知名的混合模式并不平滑,但已经太晚了,无法纠正。