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