三、程序實現
啟動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信息,但是所有關鍵信息並沒有丟失。