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

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

編輯:C#基礎知識

  點此下載本文源代碼

  現在人們具備一台數碼相機已經不是什麼新鮮事了,更何況500萬像素以上的數碼相機更是逐漸成了主流。相比較以前以膠卷為感光介質的普通相機,數碼相機可以將所照圖像即刻轉換成計算機可識別的圖像文件格式以便浏覽、共享和打印。雖然數碼相機在技術和方便性上都遠遠高於普通相機,但是筆者發現所有已經生成的圖像文件以及打印的數碼照片上都沒有拍照日期,若想在日後拍照時加上該選項也不是容易事,翻遍了數碼相機的說明書竟然沒有關於怎樣在照片上顯示拍照日期的幫助。而且,隨著數碼圖像文件的不斷增加,面對成本成本的相冊要想回顧一下其到底是在何時拍照的將會非常困難,尤其像筆者這樣不辭辛苦的記錄小兒生長歷程的朋友更感覺如此。雖然在桌面電腦上利用我的電腦浏覽所拍照的圖像文件時,在窗口底部任務欄上或者圖像文件屬性窗口的摘要頁都可以清楚地顯示出拍照日期,但是要想將拍照日期繪制到圖像上且能夠打印到數碼照片上卻沒有工具可以做到。其實,拍照日期已經保存在了圖像文件裡,我們需要自己動手編程獲取拍照日期並在圖像的右下角將其繪制出來,然後保存新生成的圖像文件並拷貝到數碼照片打印店進行打印,我們就可以獲得具備拍照日期的數碼照片了,如下圖:

  

  一、 簡介

  目前大部分數碼相機都將所拍照的圖像保存成JPG格式,而像拍照日期這樣的信息統稱為EXIF信息。EXIF是英文ExchangeableImageFile(可交換圖像文件)的縮寫,最初由日本電子工業發展協會(JEIDA--JapanElectronicIndustryDevelopmentAssociation)制訂,當時JEITA決定為數碼相機廠商專門制定一套標准,隨著數碼相機的發展,其普及趨勢越來越明顯,於是JEITA對Exif標准進行了升級,目前最新版本為2.2。其實EXIF也是一種圖像文件格式,EXIF信息就是由數碼相機在拍攝過程中采集一系列的信息,然後把信息放置在JPG文件或者TIFF文件的頭部,也就是說EXIF信息是鑲嵌在圖像文件格式內的一組拍攝參數,主要包括攝影時的光圈、快門、ISO、拍照日期時間等各種與當時攝影條件相關的信息、相機品牌型號、色彩編碼,甚至還包括拍攝時錄制的聲音以及全球定位系統(GPS)等信息。簡單的說,它就好像是傻瓜相機的日期打印功能一樣,只不過EXIF信息所記錄的資訊更為詳盡和完備。需要注意的是,用圖像處理軟件編輯過的數碼圖像文件有可能會丟失其EXIF信息。

  所以,要想在圖像上繪制拍照日期首先必須讀取EXIF信息,然後將讀取出來的拍照日期繪制在圖像表面,我們將以500萬像素分辨率為2592x1944的JPG圖像文件為對象,使用Visual Studio .Net 2005 的C#來編寫一工具程序來實現上述功能。

  二、 技術背景

  EXIF信息以鍵值對的方式保存在數碼JPG圖像文件的頭部,在.Net平台中所有圖像文件頭部信息統稱為元數據,我們可以使用GDI+讀取現有的元數據,也可以將新的元數據寫入圖像文件中。GDI+ 將單獨的元數據段存儲在 PropertyItem 對象中,讀取 Image 對象的 PropertyItems 屬性以便從某個文件中檢索所有的元數據。PropertyItems 屬性返回一個 PropertyItem 對象的數組。PropertyItem 對象具有以下四個屬性:Id、Value、Len 和 Type。Id用於標識元數據項的標記,下表顯示一些Id 的值:

十六進制值 說明 0x0320 圖像標題 0x010F 設備制造商 0x0110 設備型號 0x0132 拍照時間 0x829A Exif曝光時間 0x5090 亮度表 .... ....

  Value為數組值,這些值的格式由 Type 屬性確定。Len屬性指向的值的數組長度(以字節表示)。Type屬性指向數組中值的數據類型。下表顯示由 Type 屬性值指示的格式:

數值 說明 1 一個 Byte 2 ASCII 編碼的 Byte 對象的數組 3 16 位整數 4 32 位整數 5 包含兩個表示有理數的 Byte 對象的數組 6 未使用 7 未定義 8 未使用 9 SLong 10 SRational

  我們所感興趣的ID值就是0x0132即圖片拍照時間,對應的標記為PropertyTagDateTime,而在聯機的MSDN中我們發現了更詳細的關於EXIF屬性的GDI+的描述,PropertyTagDateTime值的類型為PropertyTagTypeASCII,它以ASCII編碼的形式保存數據,我們在獲取數據後就按照ASCII進行解碼,將一些列字節轉換為日期/時間的字符串。

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