在c#中以缩略图形式显示大量图像的最佳做法

时间:2012-04-05 17:25:53

标签: c# winforms image-processing design-patterns

通过调试和跟踪对象来获取答案非常困难,所以我需要一些帮助。

我正在尝试做什么: 我的屏幕捕获宠物项目的历史表单。历史记录必须将所有图像列为缩略图(例如:picasa)。

我做了什么: 我创建了一个HistoryItem:UserControl。 此历史记录项有几个按钮,复选框,标签和图片框。这些按钮用于删除/编辑/复制图像。复选框用于选择一个或多个图像,标签用于某些信息文本。图片框从公共属性获取图像,该公共属性是路径,方法创建比例缩略图以在加载控件时显示它。此用户控件有两个公共事件。一个用于删除图像,一个用于冒泡鼠标输入和鼠标的事件通过所有控件离开。为此我使用EventBroadcastProvider。冒泡非常有用,因为无论我将鼠标移到控件上,都会出现按钮。 dispose方法已经扩展,我手动删除事件。

通过循环包含所有图像路径的xml文件来加载所有图像。对于此XML中的每个图像,我创建了一个新的HitoryItem,它被添加(在一些编码后进行排序并限制加载的图像数量)到流布局面板。

问题: 当我在历史表单中吃午餐,并且流程布局面板上填充了我的HistoryItem自定义控件时,我的内存使用量急剧增加。从14Mb到大约100MB,加载了100个图像。通过关闭历史表单并处置我可以处理的任何内容,甚至尝试调用GC.Collect(),内存增加仍然存在。我搜索任何像图像或事件一样无法正确处理的对象,但无论我在何处使用它们,它们都会被处理掉。问题来自多个来源。一个是鼓泡事件没有正确处理,另一个是图片框本身。所有这些我只能在没有任何图像处理甚至事件的自定义控件被加载时通过将所有代码注释到有限版本来看到。如果没有事件,内存消耗将减少20%。


所以我真正的问题是,如果这个逻辑,流布局面板和带有图片框的自定义控件,是以缩略图显示大量图像的最佳解决方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

我曾经做过这一点,在内存管理方面它很糟糕。例如,您冒着越来越多的GDI句柄的风险(例如,如果每个控件都创建了Font或其他GDI对象实例),并且GC.Collect()无法解决此问题。

我为ComponentOwl.com工作,我们开发了一个用于管理名为Better Thumbnail Browser的图像缩略图的控件,它还可以为您加载,调整大小和缓存缩略图:

Better Thumbnail Browser Overview

他们还有一个名为Better ListView Express的免费组件,它仍然支持图像缩略图。