科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件利用VC# 2005为数码照片添加拍照日期

利用VC# 2005为数码照片添加拍照日期

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍料如何使用C

作者:窦瑞欣 来源:天极软件 2007年11月11日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 三、 程序实现

  启动Visual Studio .Net 2005 创建名为PicStamp的Visual C# 项目,选择Windows 应用程序模版。在默认的窗体上放置一个listBox组件用于保存需要绘制拍照日期的图片文件列表,一个textBox组件用于设置绘制后的图片文件所放置的文件夹,五个Button组件,分别用于向listBox添加图像文件、清空列表框、选择放置绘制后的图片的文件夹、实际绘制操作以及退出示例程序,一个选择文件对话框用于挑选图片文件,一个选择文件夹对话框用于选择图片文件要放置的文件夹,程序运行界面如下:


  我们自定义一个函数GetExifProperties用于返回图片文件的Exif信息,代码如下:

//获取图像文件的所有元数据属性,以PropertyItem数组的格式保存
public static PropertyItem[] GetExifProperties(string fileName)
{
 FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
 //通过指定的数据流来创建Image
 System.Drawing.Image image = System.Drawing.Image.FromStream(stream,true,false);
 return image.PropertyItems;
}

  获得所有元数据后,需要挑选出我们所感兴趣的拍照日期/时间属性所对应的值,代码如下:

//遍历所有元数据,获取拍照日期/时间
private string GetTakePicDateTime(System.Drawing.Imaging.PropertyItem[] parr)
{
 Encoding ascii = Encoding.ASCII ;
 //遍历图像文件元数据,检索所有属性
 foreach (System.Drawing.Imaging.PropertyItem p in parr)
 {
  //如果是PropertyTagDateTime,则返回该属性所对应的值
  if (p.Id==0x0132)
  {
   return ascii.GetString(p.Value);
  }
 }
 //若没有相关的EXIF信息则返回N/A
 return "N/A";
}

  循环处理图片文件列表框中的文件,并重新格式化获取的拍照日期/时间,然后通过Graphics对象将其绘制到数码图像的表面并保存为新文件,代码如下:

……
……
for (int i = 0; i < listBox1.Items.Count; i++)
{
 pi = GetExifProperties(listBox1.Items[i].ToString() );
 //获取元数据中的拍照日期时间,以字符串形式保存
 TakePicDateTime = GetTakePicDateTime(pi);
 //分析字符串分别保存拍照日期和时间的标准格式
 SpaceLocation = TakePicDateTime.IndexOf(" ");
 dt = TakePicDateTime.Substring(0, SpaceLocation);
 dt=dt.Replace(":", "-");
 tm = TakePicDateTime.Substring(SpaceLocation+1, TakePicDateTime.Length - SpaceLocation-2);
 TakePicDateTime = dt + " " + tm;
 //由列表中的文件创建内存位图对象
 Pic = new Bitmap(listBox1.Items[i].ToString());
 //由位图对象创建Graphics对象的实例
 g = Graphics.FromImage(Pic);
 //在Graphics表面绘制数码照片的日期/时间戳
 g.DrawString(TakePicDateTime, normalContentFont, new SolidBrush(normalContentColor),
 Pic.Width - 700, Pic.Height - 200);
 //将添加日期/时间戳后的图像进行保存
 Pic.Save(textBox1.Text + Path.GetFileName(listBox1.Items[i].ToString()));
 //释放内存位图对象
 Pic.Dispose();
}
……
……

  四、 总结

  该程序在Visual Studio .Net 2005 C# + Windows XP SP2下运行成功。通过实际使用该程序可以批量且有效地将数码图片拍照日期/时间绘制到图像表面,我们是以分辨率为2592x1944的JPG图像文件为绘制对象,读者可以根据实际图片尺寸适当调整源码中拍照日期/时间的字体、大小以及位置。本文仅演示了如何读取EXIF信息,读者可以稍加改动就可以修改EXIF信息并加以保存。还有需要注意的是,正像本文开头所提到的,任何图像编辑软件对数码照片的编辑都有可能使EXIF信息丢失,本文示例程序也不例外,经过绘制后的数码图片确实会丢失一些EXIF信息,但是所有关键信息并没有丢失。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章