嘗試ExifLib - 沒有與源,它可以提取,你可以使用一個像所有標籤演示項目。
編輯:我要追加我的答案來解釋爲什麼我相信.Net Image類不能像我們所期望的那樣處理所有EXIF標籤。不過,我會在上面留下我的初步鏈接和建議,因爲我相信這是最終的最佳選擇。
好了,到爲什麼:
的文件下使用的圖像,其中Windows 7中顯示EXIF數據,品牌和型號的描述我的測試(點擊右鍵>屬性>「詳細資料」選項卡>「相機」部分),但在.Net中,PropertyItems
不包含這些相同的EXIF標記。在另一個答案中提到了使用HTC One拍攝的圖像,因此我找到了符合我的測試here的圖像。 (具體來說,我從這個網頁使用了original-2.jpg,original-4.jpg和original-8.jpg)。
首先,我看着img.PropertyItems.Count()
得到了32.所以裏面有數據! (顯然,我們知道Windows 7在我的情況下是看到EXIF標籤)。但是,當我遍歷.PropertyItems
,並在每個Id
看(按你原來的問題):
- 我得到32個結果
- 我不明白造成271(0x010F - 相機品牌)的ID或272 (0x0110 - 相機型號)
- 我沒有得到282,283,296,305,306等27點5位數的ID
- 如果我使用
img.PropertyItems.Single(x => x.Id == 305).Value
我得到了SoftwareUsed(或者,如果我使用206我得到的日期時間)EXIF屬性
那麼,就你而言,爲什麼.Net Image類沒有看到帶有271/272的Ids(再次,Camera Make/Model)的EXIF標籤?
我挖成ExifLib的源代碼(鏈接答案的頂部)一點點,覺得我看到發生了什麼:
- 如果您在ExifReader.cs看
private byte[] GetTagBytes(...)
方法(線655),你將看到字節偏移量用於查找'Exif IDF'和每個標記的總空間
- 此方法返回一個特定的字節數組,然後將其轉換爲正確的數據類型
- 如果該類型是ASCII字符串 - 空字符被刪除並且日期格式被調整
因此,看起來.Net Image類能夠通過PropertyItems
正確地返回EXIF標記,當有不是任何字節偏移在播放。
使用ExifDataView(http://www.nirsoft.net/utils/exif_data_view.html)我能證實這一點:
- 我發現我總是能夠使用.NET來正確地獲取品牌和型號,當值長度爲4(「HTC」 +空字符)
- 我從來能夠使用的.Net時長爲5(「HTC」 +空+空?)
- 在我的測試上面(與原-4.JPG圖) SoftwareUsed和DateTime標籤因爲這些標籤的長度而起作用(字符串長度)+1表示空字符。 Camera Make標籤長度爲(字符串長度)+ 2,並且不起作用。這似乎把一切都拋開了。
ExifLib代碼可以正確處理這些偏移和/或多個空字符,而.Net不會。
結果是.NET圖片類不超過這些特性的PropertyItems
部分迭代和返回使用image.PropertyItems.Single(x => x.Id == tagMake).Value
底線當「序列不包含匹配元件」:使用ExifLib或一些其它第三第三方庫設計用於處理提取EXIF數據,如果你想讓它適用於所有圖像。使用.Net Image類,如果你希望它的某些時間字節是正確的:-)
我已經看過其他解決方案,那是其中之一,我很欣賞這些輸入,其中之一可能最終成爲我最終使用的解決方案。然而,這樣做的目的是爲了理解爲什麼.NET圖像類正在跳過這些項目,而其他人似乎選擇了它們。對我來說,在這個階段它代表我的錯誤或誤解,因爲雖然它是特定於圖像源的,但其他軟件產品似乎沒有問題。 – Sabre
這位先生,正是我所尋找的,對本地.NET類的解決方案或可驗證的缺乏支持。非常感謝! – Sabre