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

C# 中的照片相册

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.21/5 (17投票s)

2004年12月15日

4分钟阅读

viewsIcon

137360

downloadIcon

5460

本文介绍如何制作类似照片簿的程序。

包含已编译的二进制文件。此外,程序会将您的照片整理到仅包含文件(=图像)或文件夹的目录中。由于程序会修改您的文件夹结构,建议仅使用您的图像副本(您不介意修改的副本)运行此程序。对于此程序造成的任何意外后果以及可能对您的数据造成的任何损害,我概不负责。

Sample Image

引言

以下是关于我正在编写的照片簿程序的描述。它旨在成为一个独立的照片查看和编辑应用程序。目前,它能够加载图像并将其显示为缩略图。还有一个预览窗口。程序还允许用户更改图像的元数据(或属性),这些元数据在您单击Windows资源管理器中的“属性”并转到“摘要”选项卡时显示。

请注意,您需要使用.NET Framework 2.0版,因为该项目使用了仅在2.0版中才有的泛型和其他功能。

背景

该程序目前包含一个任务窗格(类似于Windows资源管理器中的任务窗格)。但是,它目前还没有任何命令。这些命令当然会得到更新。任务窗格由Mathew Hall开发,他的文章可以在Code Project上找到这里(做得很好!)。

使用代码

实际上,本文没有可重用的代码。在“照片簿辅助控件”项目中有一些类

  • CloseButton -- 模拟工具窗口上的关闭按钮(这是从画图中拖出一个工具栏后获得的窗口类型)。
  • ToolWindowTitleBar -- 模拟工具窗口的标题栏。这里要提到的一点是,视觉样式(Windows的一部分)还不够完善,无法正确绘制文本。如果您查看Windows工具窗口,您会看到文本是白色的;但是,当您尝试使用以下代码绘制它时,文本会以黑色绘制。(这不是.NET的问题,而是Windows的问题。)
    protected override void OnPaint(PaintEventArgs e)
    {
        ...
    
        VisualStyleRenderer vsr = new VisualStyleRenderer("Window", 2, state);
    
        vsr.DrawText(e.Graphics, new Rectangle(offset, 0, 
            Width - 3 * offset - h, Height),
            Caption, true, TextFormatFlags.EndEllipsis);
        ...
    }

    因此,我不得不使用以下代码

    protected override void OnPaint(PaintEventArgs e)
    {
        ...
    
        e.Graphics.DrawString(Caption, SystemFonts.SmallCaptionFont,
            SystemBrushes.ActiveCaptionText,
            new RectangleF(offset, 
                (Height - (int)e.Graphics.MeasureString(Caption, 
                SystemFonts.SmallCaptionFont).Height)/2,
                Width - 3 * offset - h, Height
            )
        );
        ...
    }
  • ToolWindowGroup -- 将上述两个控件组合成一个容器控件。它看起来像一个带有标题栏工具窗口标题的面板。

    这里需要注意的是,当您向其中添加控件并将其停靠时,您始终希望它们位于前面(尤其是在停靠到填充时,位于标题栏的前面)。为此,我添加了以下代码

    protected override void OnControlAdded(ControlEventArgs e)
    {
        TitleBar.SendToBack();
        // always send the titlebar to the back whenever a control is added.
    }
  • CyclingProgressBar -- 正如其名称所示,此控件模拟进度条控件,但它不是显示完成百分比,而是循环显示。此控件实际上是一个OwnerDraw用户控件,它使用新的视觉样式进行呈现。这实际上是一个非常有用的控件。

关注点

此项目的代码包含在三个不同的项目中。我们已经提到了“PhotoAlbumHelperControls”,但除此之外,还有一个模拟文件夹树的库。它会在系统发生更改时动态更新结构。但是,出于我的目的,我需要一组像文件夹树一样但能跟踪图像和相册的类。此库中的内容就是由此产生的。此库中的代码尚未清理,仍在开发中。并非所有功能都经过测试。这里需要注意的是,使用这些类,您可以更新图像文件的元数据。目前,只支持拍摄图片的日期/时间(更改属性编号306,而不是Windows使用的编号)和图像标题。显然,还有无数其他的属性,这正在开发中。

_Photo.Properties.Date.Value = DatePictureTakenDateTimePicker.Value;
// this is in the file EditablePropertiesControl.cs

历史

  • 2004年12月14日 - 在Code Project上首次发布。Alpha版本(实际上只是一个查看器)。

即将推出的功能

  • 编辑所有图像属性。
    • 包括对图片中人物的特殊编辑以及与MS Outlook联系人的接口。
  • 将类似的图像组合成多页TIFF文件。
  • 其他布局/视图,包括“幻灯片放映视图”。
  • 图像编辑。
    • 裁剪
    • 红眼修复
    • 旋转
  • 欢迎提出其他建议。
© . All rights reserved.