Crystal Image Toolkit:缩略图控件和图片查看器。






4.68/5 (19投票s)
使用 C# 为 Windows Forms 开发的缩略图和图片查看控件。
引言
早在 2006 年,我就开始使用 C# 开发 Windows Forms 应用程序。我遇到了一系列项目,需要在一个窗体控件中显示缩略图,但我需要使背景、边框和文本元素可定制。我开发了一系列名为 Crystal Image Toolkit 的控件,使我能够构建显示缩略图和完整图片的应用程序。
我可能不应该把它命名为 Crystal,因为人们会错误地将其与 Crystal Reports 联系起来。我选择这个名字是因为一个漫威漫画角色。我也想到了 Crystal Clear 图像,或者那首歌 Crystal Blue Persuasion。或者,我可能只是个疯子!
使用代码
我将向您展示如何快速将图像缩略图控件添加到您的 Windows Forms 应用程序中。
首先,从上面的链接下载 Crystal Image Toolkit。使用我提供的解决方案编译代码,该解决方案负责工具包和所有演示示例。
在 Visual Studio 中创建一个新的 Windows Forms 应用程序。在 Visual Studio 工具箱中,添加一个名为 Crystal Image Toolkit 的新选项卡(与 Crystal Reports 分开),然后添加 CrystalToolkit.dll 中的控件。
选择名为“CrystalImageGridView
”的控件。这是显示缩略图的控件。将此控件拖到您的新窗体上。
现在,转到属性窗口,选中“crystalImageGridView1
”。将 Dock
属性更改为 Fill
。将 Orientation
属性更改为 Vertical
。
设置完属性后,图像网格控件应该看起来像这样
蓝色边框只是让您大致了解选中状态下图像项的外观。损坏的图像位图只是一个占位符。在运行时,您的图像将放置在此蓝色矩形内。是的,您可以更改许多其他属性,包括边框颜色、背景颜色等。但目前,我们接受默认设置。
让我们写一点代码。转到事件选项卡,双击 Load,然后在窗体上生成事件。现在您在 Form1.cs 中,让我们在 Form 类顶部添加此字段
/// <summary>
/// CrystalCollector object, assists in retrieving image files in a specified folder.
/// </summary>
private CrystalCollector _theCollector = null;
CrystalCollector
对象是此框架中的控制器。
该收集器与 CrystalImageGridView
和 CrystalImageGridModel
一起工作。它查找 ImageLocation
属性中设置的图像文件,创建对象来镜像这些文件作为 CrystalImageItem
对象,并将它们放入模型中。收集器生成一个后台线程来开始缩略图像项;该线程向视图发送事件,告诉它何时可以获得图像缩略图。这就是幕后发生的事情,但在我们这个简单的例子中,您只需要将此方法添加到您的窗体中
private void InitCollector()
{
_theCollector =
CrystalCollectorFactory.DefaultFactory.CreateCollector
(CrystalCollectorType.CrystalFileCollector);
// Add the CrystalImageGridView object to the collector.
// The collector will work with the view to draw the images.
_theCollector.SetupView(crystalImageGridView1);
// Optional:
// Set an initial folder to collect images.
// If no folder is set, collector starts at MyPictures
// in WinXP or Pictures folder in Vista
//CrystalCollectorFactory.DefaultFactory.InitCollectorSource
//("c:\\myImages", _theCollector);
// Tell CrystalFileCollector to collect the images in the
// ImageLocation folder.
_theCollector.CollectImages();
}
private void Form1_Load(object sender, EventArgs e)
{
InitCollector();
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (_theCollector != null)
{
_theCollector.StopCollection();
}
base.OnFormClosing(e);
}
InitCollector
使用工厂创建收集器对象。它选择的类型是基于文件的收集器。您可以自己创建一个新的 CrystalFileCollector
,但使用工厂更好。这可以用于跟踪稍后创建/销毁的对象。
创建收集器后,我们调用 SetupView
,传入我们拖到窗体上的 CrystalImageGridView
对象。这必须在收集任何图像之前完成。收集器创建一个 CrystalImageGridModel
对象,并将视图链接到它。模型必须了解某些视图属性,这些属性会影响图像项的显示方式。
最后调用 CollectImages
,它告诉收集器查看 ImageLocation
并开始收集有关其中找到的图像的数据。在这种情况下,我们没有设置 ImageLocation
— 默认设置为您的Pictures 文件夹(在 Vista 上)或 MyPictures 文件夹(在 WinXP 中)。如果要初始化另一个 ImageLocation
,请使用我在调用 CollectImages
上方注释掉的代码。
Form1_Load
调用 InitCollector
。但是,还有一个 OnFormClosing
的重写,它调用收集器对象上的 StopCollector
方法。此调用将停止任何正在进行缩略图像的后台线程。
编译并执行此代码后,您应该会看到您Pictures 文件夹中任何图像的缩略图。希望它们是朋友、家人和宠物的图像,而不是漫画书图像!
摆弄这个窗体——您应该会看到控件响应大小调整事件,使每行图像项的数量随着窗体的增大或缩小而增长或收缩。您还可以使用 Ctrl+单击和 Shift+单击图像项进行多选。
这些缩略图存储在哪里?执行创建它们工作的 CrystalThumbnailer
对象有一个名为 ThumbnailLocationRoot
的属性。默认情况下,它是您的 AppData 文件夹,在您的公司和产品名称下。
收集器在此处创建一个子文件夹,该子文件夹基于原始位置的哈希编号。它在这里存储缩略图——它需要显示的最大的缩略图尺寸。在这些简单的演示中,缩略图将永久存在。我已决定保留或删除它们的行为取决于应用程序,并将选择权留给了您。
这显然是一个非常简单的例子,但我已将许多示例窗体应用程序包含在工具包中
SimpleImageGridDemo 展示了这个应用程序的一个稍微复杂一点的版本,通过允许您打开任何文件夹并查看缩略图。
ZoomImageGrid 向您展示了如何设置 CrystalImageGridView
来放大或缩小缩略图大小。这有点像一个技巧;缩略图以其最大的可能尺寸存储,并根据名为 ZoomFactor
的属性进行缩放。
WaitFormPictureShow 演示了如何使用 CrystalMemoryCollector
直接加载图像,而无需扫描文件夹。
HeaderImageGridDemo 解释了如何将 CrystalImageItem
对象列表放入 CrystalGroupItem
中。组项目可以插入到模型中,并具有特殊的标题显示,该标题可以折叠/展开。不幸的是,我没有在 ZoomFactor
上测试过它。
PictureShowControllerDemo(上方)向您展示了如何创建一个更逼真的图片查看应用程序。使用一个拆分容器将底部窗格中的 CrystalImageGridView
(Horizontal
方向)保存起来。顶部窗格包含 CrystalPictureShow
控件,用于显示图像、放大它们以及进行幻灯片放映。还有一个平移窗口,在以非适合模式显示图像时出现。
ComicShowControllerDemo 是一个专门的图像查看器,它处理以 CDisplay 查看器格式化的漫画书文件,扩展名为 .CBR 或 .CBZ。您可能从未听说过它们,但它们正成为共享漫画书的类似 MP3 的标准。CBR 本质上只是一个 RAR 文件,而 CBZ 是一个 ZIP 文件。工厂将为这些格式调用专门的水晶收集器,解压图像并显示它们。
关注点
在我编写了 CrystalImageGridView
之后,我自然需要显示一个完整的图像,但 PictureBox
控件不足以满足我的需求。我需要缩放/放大图像,添加渐变背景效果,使其与平移窗口一起工作,甚至还可以进行幻灯片放映。我综合了 CodeProject 上许多文章的代码,也借鉴了 Bob Powell 的代码,他为各种 .NET GDI+ 代码做出了很多贡献。我已尽力在 CrystalPictureBox
和 CrystalPictureShow
的代码中尽可能地归功于他。
如果您运行 PictureShowControllerDemo 并单击 Slideshow 按钮,您将看到这些效果:Fade、Iris、Spin 和 Slide。
通过编写这个工具包,我学到了很多东西,但它远非完美。收集器仅支持一种视图;我早期犯了一个严重的错误,将视图显示矩形放在模型中,而不是有一个视图可以访问的单独数据结构。要修复它,我需要重写很多代码,但我准备开始一个新项目。我希望我的源代码能让其他人受益。
我想做的另一个改进是让视图控制后台缩略图线程。目前,它会按显示的排序顺序缩略图像;更理想的做法是像 Windows 照片库那样,缩略当前滚动位置可见的图像。
这里还有一些其他控件,例如滑块、渐变面板等。我不支持这些,但因为示例会使用它们,所以我将它们保留在工具包中。
历史
- Crystal Image Toolkit 1.0.0 - 2008 年 12 月 6 日。
- Crystal Image Toolkit 1.0.1 - 2011 年 5 月 11 日:源代码已更新为 Visual Studio 2010 和 .NET Framework 4.0。