2011年11月22日 星期二

Java讀取圖片EXIF資訊


首先介紹一下什麼是EXIFEXIFExchangeable Image File的縮寫,這是一種專門為數碼相機照片設定的格式。這種格式可以用來記錄數位照片的屬性資訊,例如相機的品牌及型號、相片的拍攝時間、拍攝時所設置 的光圈大小、快門速度、ISO等等資訊。除此之外它還能夠記錄拍攝資料,以及照片格式化方式,這樣就可以輸出到相容EXIF格式的外設上,例如照片印表機 等。
目前最常見的支援EXIF資訊的圖片格式是JPG,很多的圖像工具都可以直接顯示圖片的EXIF資訊,包括現在的一些著名的相冊網站也提供頁面用於 顯示照片的EXIF資訊。本文主要介紹Java語言如何讀取圖像的EXIF資訊,包括如何根據EXIF資訊對圖像進行調整以適合使用者流覽。
目前最簡單易用的EXIF資訊處理的Java包是Drew Noakes寫的metadata-extractor,該專案最新的版本是2.3.4,支持EXIF 2.2版本。你可以直接從http://www.drewnoakes.com/code/exif/ 下載該項目的最新版本包括其源碼。
需要注意的是,並不是每個JPG影像檔都包含有EXIF資訊,你可以在Windows資源管理器按一下選中圖片後,如果該圖片包含EXIF資訊,則會在屬性->摘要中顯示出來。

拍攝設備的型號便是EXIF資訊中的其中一個。下面我們給出一段代碼將這個圖片的所有的EXIF資訊全部列印出來。
Java代碼  收藏代码
1.  import java.io.File;  
2.  import java.util.Iterator;  
3.     
4.  import com.drew.imaging.jpeg.JpegMetadataReader;  
5.  import com.drew.metadata.Directory;  
6.  import com.drew.metadata.Metadata;  
7.  import com.drew.metadata.Tag;  
8.  import com.drew.metadata.exif.ExifDirectory;  
9.     
10. /** 
11.  * 測試用於讀取圖片的EXIF資訊 
12.  * @author Winter Lau 
13.  */  
14. public class ExifTester {  
15.      public static void main(String[] args) throws Exception {  
16.          File jpegFile = new File("C:/Documents and Settings/Administrator/workspace/ipv6/src/test/a.JPG");  
17.          Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);  
18.          Directory exif = metadata.getDirectory(ExifDirectory.class);  
19.          Iterator tags = exif.getTagIterator();  
20.          while (tags.hasNext()) {  
21.              Tag tag = (Tag)tags.next();  
22.              System.out.println(tag);  
23.          }  
24.      }  
25. }  
 這個結果顯示如下:
Js代碼  收藏代码
1.  [Exif] Make - OLYMPUS OPTICAL CO.,LTD  
2.  [Exif] Model - u10D,S300D,u300D  
3.  [Exif] Orientation - Top, left side (Horizontal / normal)  
4.  [Exif] X Resolution - 72 dots per inch  
5.  [Exif] Y Resolution - 72 dots per inch  
6.  [Exif] Resolution Unit - Inch  
7.  [Exif] Software - 22-1012                          
8.  [Exif] Date/Time - 2005:04:14 13:47:10  
9.  [Exif] YCbCr Positioning - Datum point  
10. [Exif] Exposure Time - 0.01 sec  
11. [Exif] F-Number - F5.2  
12. [Exif] Exposure Program - Program creative (slow program)  
13. [Exif] ISO Speed Ratings - 80  
14. [Exif] Exif Version - 2.20  
15. [Exif] Date/Time Original - 2005:04:14 13:47:10  
16. [Exif] Date/Time Digitized - 2005:04:14 13:47:10  
17. [Exif] Components Configuration - YCbCr  
18. [Exif] Exposure Bias Value - 0 EV  
19. [Exif] Max Aperture Value - F3.1  
20. [Exif] Metering Mode - Multi-segment  
21. [Exif] Light Source - Unknown  
22. [Exif] Flash - Flash did not fire, auto  
23. [Exif] Focal Length - 17.4 mm  
24. [Exif] User Comment -   
25. [Exif] FlashPix Version - 1.00  
26. [Exif] Color Space - sRGB  
27. [Exif] Exif Image Width - 1024 pixels  
28. [Exif] Exif Image Height - 768 pixels  
29. [Exif] File Source - Digital Still Camera (DSC)  
30. [Exif] Windows XP Title - 風景  
31. [Exif] Windows XP Author - 一路風塵  
32. [Exif] Windows XP Keywords - 你是我的唯一  
33. [Exif] Windows XP Subject - 我的第一張  
34. [Exif] Custom Rendered - Normal process  
35. [Exif] Exposure Mode - Auto exposure  
36. [Exif] White Balance - Auto white balance  
37. [Exif] Digital Zoom Ratio - 1  
38. [Exif] Scene Capture Type - Landscape  
39. [Exif] Gain Control - None  
40. [Exif] Contrast - None  
41. [Exif] Saturation - None  
42. [Exif] Sharpness - None  
43. [Exif] Unknown tag (0xc4a5) - 80 114 105 110 116 73 77 0 480 2 -10...  
44. [Exif] Compression - JPEG (old-style)  
45. [Exif] Thumbnail Offset - 2022 bytes  
46. [Exif] Thumbnail Length - 5864 bytes  
47. [Exif] Thumbnail Data - [5864 bytes of thumbnail data]  
 起初的時候,我只想找到圖片的作者,標題,關鍵字這三欄資訊,那如何取得這三者的資訊呢。可以直接使用API如下:
metadata中定義了很多TAG資訊:比如:TAG_WIN_AUTHOR
TAG_WIN_KEYWORDS
TAG_WIN_TITLE
等定義在Windows中資訊。所以我們只要:
Java代碼  收藏代码
1.  package test;  
2.  import java.io.File;  
3.  import java.util.Iterator;  
4.     
5.  import com.drew.imaging.jpeg.JpegMetadataReader;  
6.  import com.drew.metadata.Directory;  
7.  import com.drew.metadata.Metadata;  
8.  import com.drew.metadata.Tag;  
9.  import com.drew.metadata.exif.ExifDirectory;  
10.    
11. /** 
12.  * 測試用於讀取圖片的EXIF資訊 
13.  * @author Winter Lau 
14.  */  
15. public class PicExif {  
16.      public static void main(String[] args) throws Exception {  
17.          File jpegFile = new File(  
18.                           "C:/Documents and Settings/Administrator/workspace/ipv6/src/test/a.JPG");  
19.          Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);  
20.          Directory exif = metadata.getDirectory(ExifDirectory.class);  
21.          Iterator tags = exif.getTagIterator();  
22.   
23.           if(exif.containsTag(ExifDirectory.TAG_WIN_AUTHOR)){  
24.               System.out.println("Pic author is "+exif.getDescription(ExifDirectory.TAG_WIN_AUTHOR));        
25.          }  
26.           if(exif.containsTag(ExifDirectory.TAG_WIN_TITLE)){  
27.             System.out.println("Pic title is "+exif.getDescription(ExifDirectory.TAG_WIN_TITLE));      
28.           }  
29.           if(exif.containsTag(ExifDirectory.TAG_WIN_KEYWORDS)){  
30.         System.out.println("Pic keyword is "+exif.getDescription(ExifDirectory.TAG_WIN_KEYWORDS));  
31.          }  
32.      }  
33. }  
 列印的結果:
Java代碼  收藏代码
1.  Pic author is 一路風塵  
2.  Pic title is 風景  
3.  Pic keyword is 你是我的唯一  
 有了這些API,我們還可以做其他事情。這裡不一一列舉了,有興趣的直接看http://www.drewnoakes.com/code/exif/javadoc/ 

沒有留言: