程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 利用VC# 2005為數碼照片添加拍照日期(2)

利用VC# 2005為數碼照片添加拍照日期(2)

編輯:關於C語言

三、程序實現

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved