65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (19投票s)

2008 年 12 月 7 日

LGPL3

7分钟阅读

viewsIcon

113516

downloadIcon

8338

使用 C# 为 Windows Forms 开发的缩略图和图片查看控件。

Crystal_Image_Toolkit.png

引言

早在 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 中的控件。

Designer_toolbox.png

选择名为“CrystalImageGridView”的控件。这是显示缩略图的控件。将此控件拖到您的新窗体上。

step_1_-_drop_CrystalImageGridView_on_Form.png

现在,转到属性窗口,选中“crystalImageGridView1”。将 Dock 属性更改为 Fill。将 Orientation 属性更改为 Vertical

step_2_-_set_properties.png

设置完属性后,图像网格控件应该看起来像这样

Control_after_set_properties.png

蓝色边框只是让您大致了解选中状态下图像项的外观。损坏的图像位图只是一个占位符。在运行时,您的图像将放置在此蓝色矩形内。是的,您可以更改许多其他属性,包括边框颜色、背景颜色等。但目前,我们接受默认设置。

让我们写一点代码。转到事件选项卡,双击 Load,然后在窗体上生成事件。现在您在 Form1.cs 中,让我们在 Form 类顶部添加此字段

/// <summary>
/// CrystalCollector object, assists in retrieving image files in a specified folder.
/// </summary>
private CrystalCollector _theCollector = null;

CrystalCollector 对象是此框架中的控制器。

该收集器与 CrystalImageGridViewCrystalImageGridModel 一起工作。它查找 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 文件夹中任何图像的缩略图。希望它们是朋友、家人和宠物的图像,而不是漫画书图像!

Simple_form_with_thumbnail_image_control.png

摆弄这个窗体——您应该会看到控件响应大小调整事件,使每行图像项的数量随着窗体的增大或缩小而增长或收缩。您还可以使用 Ctrl+单击和 Shift+单击图像项进行多选。

这些缩略图存储在哪里?执行创建它们工作的 CrystalThumbnailer 对象有一个名为 ThumbnailLocationRoot 的属性。默认情况下,它是您的 AppData 文件夹,在您的公司和产品名称下。

Thumbnail_image_location.png

收集器在此处创建一个子文件夹,该子文件夹基于原始位置的哈希编号。它在这里存储缩略图——它需要显示的最大的缩略图尺寸。在这些简单的演示中,缩略图将永久存在。我已决定保留或删除它们的行为取决于应用程序,并将选择权留给了您。

这显然是一个非常简单的例子,但我已将许多示例窗体应用程序包含在工具包中

SimpleImageGridDemo 展示了这个应用程序的一个稍微复杂一点的版本,通过允许您打开任何文件夹并查看缩略图。

ZoomImageGrid 向您展示了如何设置 CrystalImageGridView 来放大或缩小缩略图大小。这有点像一个技巧;缩略图以其最大的可能尺寸存储,并根据名为 ZoomFactor 的属性进行缩放。

WaitFormPictureShow 演示了如何使用 CrystalMemoryCollector 直接加载图像,而无需扫描文件夹。

HeaderImageGridDemo 解释了如何将 CrystalImageItem 对象列表放入 CrystalGroupItem 中。组项目可以插入到模型中,并具有特殊的标题显示,该标题可以折叠/展开。不幸的是,我没有在 ZoomFactor 上测试过它。

PictureShowDemo.png

PictureShowControllerDemo(上方)向您展示了如何创建一个更逼真的图片查看应用程序。使用一个拆分容器将底部窗格中的 CrystalImageGridViewHorizontal 方向)保存起来。顶部窗格包含 CrystalPictureShow 控件,用于显示图像、放大它们以及进行幻灯片放映。还有一个平移窗口,在以非适合模式显示图像时出现。

ComicShowControllerDemo 是一个专门的图像查看器,它处理以 CDisplay 查看器格式化的漫画书文件,扩展名为 .CBR.CBZ。您可能从未听说过它们,但它们正成为共享漫画书的类似 MP3 的标准。CBR 本质上只是一个 RAR 文件,而 CBZ 是一个 ZIP 文件。工厂将为这些格式调用专门的水晶收集器,解压图像并显示它们。

关注点

在我编写了 CrystalImageGridView 之后,我自然需要显示一个完整的图像,但 PictureBox 控件不足以满足我的需求。我需要缩放/放大图像,添加渐变背景效果,使其与平移窗口一起工作,甚至还可以进行幻灯片放映。我综合了 CodeProject 上许多文章的代码,也借鉴了 Bob Powell 的代码,他为各种 .NET GDI+ 代码做出了很多贡献。我已尽力在 CrystalPictureBoxCrystalPictureShow 的代码中尽可能地归功于他。

如果您运行 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。
© . All rights reserved.