用C 讀取數碼相片的EXIF資訊(一)

2021-04-21 05:45:53 字數 1485 閱讀 5572

現在的數位相機拍攝出來的**表面上看都是很普通的jpeg的,但通常還包含著諸如相片拍攝時使用的相機生產商、型號、光圈值、快門速度等各類附加資訊,這就是所謂的exif資訊。exif是一種影象檔案格式,只是檔案的字尾名還是沿用大家熟悉的jpg而已。掌握exif資訊對學習提高攝影技術很有幫助。

c#.net作為一種現代的全能開發語言,對exif也有著較好的支援。在.net中,我們可以用propertyitem物件來獲取exif。

取得propertyitem很簡單。

image img = image.fromfile("支援exif的檔案");           

propertyitem pt = img.propertyitems;

這樣就可以了,exif資訊都已載入到propertyitem陣列中了。

其中propertyitem的id,type,value屬性是最重要的。

id可以唯一表明當前propertyitem的含義。比如,0x010f代表相機製造商,0x8827代表iso速度,0x829d代表相機f值。這在msdn中有非常詳盡的介紹。我們首先需要花一定的精力將這些數字翻譯**類可理解的自然語言。這個實現起來很簡單但是很無聊,做成hashtable或自己寫一堆case都可以,看個人喜歡吧。

value永遠都是位元組陣列,但具體內容的取值方法隨type不同而不同。

type是個整數,表示的型別在msdn中是這麼描述的:

1 指定 value 為位元組陣列。

2 指定 value 為空終止 ascii 字串。如果將型別資料成員設定為 ascii 型別,則應該將 len 屬性設定為包括空終止的字串長度。例如,字串「hello」的長度為 6。

3 指定 value 為無符號的短(16 位)整型陣列。

4 指定 value 為無符號的長(32 位)整型陣列。

5 指定 value 資料成員為無符號的長整型對陣列。每一對都表示乙個分數;第乙個整數是分子,第二個整數是分母。

6 指定 value 為可以包含任何資料型別的值的位元組陣列。

7 指定 value 為有符號的長(32 位)整型陣列。

10 指定 value 為有符號的長整型對陣列。每一對都表示乙個分數;第乙個整數是分子,第二個整數是分母。

所以取exif的演算法重點在於如何根據type值將value位元組陣列變**類可以理解的值。

獲取每一條exif資訊演算法的框架大概是這樣的:

foreach (propertyitem p in pt)

currentexifinfo = 翻譯id到人類可讀文字(p.id.tostring()) + ":" + currentexifdetail;

}舉個實際例子來看看。比如,當我們掃瞄propertyitem到d == 0x0110,發現其type = 2,說明value裡的值就是c格式的普通字元陣列,乙個個取出來就是人類可以閱讀的字串了。

public string getvalueoftype2(byte b)

在接下來的文章中,我們將仔細討論各種type應該如何取值。

用C 讀取數碼相片的EXIF資訊(一)

現在的數位相機拍攝出來的 表面上看都是很普通的jpeg的,但通常還包含著諸如相片拍攝時使用的相機生產商 型號 光圈值 快門速度等各類附加資訊,這就是所謂的exif資訊。exif是一種影象檔案格式,只是檔案的字尾名還是沿用大家熟悉的jpg而已。掌握exif資訊對學習提高攝影技術很有幫助。c net作為...

C 處理數碼相片之馬賽克的實現

應聽眾點播要求,今天講講馬賽克演算法的實現。老規矩,不求甚解,只許看不許問為什麼 很多處理的演算法從原理上講其實非常簡單,難點往往在如何去寫演算法實現它,更加難的就是如何去優化實現的演算法。雖說我一向認為程式設計師的效率比程式 的效率更重要,但為了等處理一張自己拍攝的數碼 溜出去買杯奶茶順便再買張彩...

C 處理數碼相片之馬賽克的實現

應聽眾點播要求,今天講講馬賽克演算法的實現。老規矩,不求甚解,只許看不許問為什麼 很多處理的演算法從原理上講其實非常簡單,難點往往在如何去寫演算法實現它,更加難的就是如何去優化實現的演算法。雖說我一向認為程式設計師的效率比程式的效率更重要,但為了等處理一張自己拍攝的數碼 溜出去買杯奶茶順便再買張彩票...