Java抽取照片的元數據信息

nc6433 9年前發布 | 4K 次閱讀 Java

首先簡單看看什么是元數據(Metadata)。元數據是數據的數據或者叫做用來描述數據的數據。這句解釋也許很抽象,我們看個他的用途。我們可以把元數據簡單的理解成,最小的數據單位。元數據可以為數據說明其元素或屬性或其結構以及相關數據。

最廣泛的其中一個應用就是每張相片中都包含了一個Exif信息,它就是一種用來描述數碼圖片的元數據。EXIF是exchangeable Image File的縮寫,這是一種專門為數碼相機照片設定的格式。這種格式可以用來記錄數字照片的屬性信息,例如相機的品牌及型號、相片的拍攝時間、拍攝時所設置 的光圈大小、快門速度、ISO等等信息。除此之外它還能夠記錄拍攝數據,以及照片格式化方式。

根據Exif2.1標準,元數據信息包含:

Image Description 圖像描述、來源. 指生成圖像的工具
Artist 作者 有些相機可以輸入使用者的名字
Make 生產者 指產品生產廠家
Model 型號 指設備型號
Orientation方向 有的相機支持,有的不支持
XResolution/YResolution X/Y方向分辨率 本欄目已有專門條目解釋此問題。
ResolutionUnit分辨率單位 一般為PPI
Software軟件 顯示固件Firmware版本
DateTime日期和時間
YCbCrPositioning 色相定位
ExifOffsetExif信息位置,定義Exif在信息在文件中的寫入,有些軟件不顯示。
ExposureTime 曝光時間 即快門速度
FNumber光圈系數
ExposureProgram曝光程序 指程序式自動曝光的設置,各相機不同,可能是Sutter Priority(快門優先)、Aperture Priority(快門優先)等等。
ISO speed ratings感光度
ExifVersionExif版本
DateTimeOriginal創建時間
DateTimeDigitized數字化時間
ComponentsConfiguration圖像構造(多指色彩組合方案)
CompressedBitsPerPixel(BPP)壓縮時每像素色彩位 指壓縮程度
ExposureBiasValue曝光補償。
MaxApertureValue最大光圈
MeteringMode測光方式, 平均式測光、中央重點測光、點測光等。
Lightsource光源 指白平衡設置
Flash是否使用閃光燈。
FocalLength焦距,一般顯示鏡頭物理焦距,有些軟件可以定義一個系數,從而顯示相當于35mm相機的焦距 MakerNote(User Comment)作者標記、說明、記錄
FlashPixVersionFlashPix版本 (個別機型支持)
ColorSpace色域、色彩空間
ExifImageWidth(Pixel X Dimension)圖像寬度 指橫向像素數
ExifImageLength(Pixel Y Dimension)圖像高度 指縱向像素數
Interoperability IFD通用性擴展項定義指針 和TIFF文件相關,具體含義不詳
FileSource源文件 Compression壓縮比。

元數據最大的好處是,它使信息的描述和分類可以實現格式化,從而為機器處理創造了可能。那我們如何拿到這些信息呢?這里介紹Drew Noakes寫的metadata-extractor。目前最新的版本是V2.5.0 RC2。我發現這個版本與之前的V2.3.1還是做了一些更改,包括API的實現。關于V2.3.1版本的元數據提取可以參考我之前寫的文章:Java讀取圖片EXIF信息

接下來看看如何使用Metadata-extractor類庫來讀取圖片中的元數據。這樣做的一個應用就是你可以給你的圖片按照某種格式分類的,用過Google picasa中就有這種功能。

首先需要導入metadata-extractor-2.5.0-RC2.jar,如果你是直接在console編譯的話,那么編譯語 句:javac -d. -classpath metadata-extractor-2.5.0-RC2.jar MetaDataReader.java 下面是MetaDataReader.java的源碼:

import java.io.File;
import java.util.Collection;
import java.util.Iterator;

import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;

import com.drew.metadata.exif.ExifIFD0Directory;

/**
 * 測試用于讀取圖片的EXIF信息
 * @author Leyond
 * @Blog   codecho.com
 */
public class MetaDataReader {
     public static void main(String[] args) throws Exception {
         File jpegFile = new File("src/Nikon E990.jpg");
         Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);
         Directory exif = metadata.getDirectory(ExifIFD0Directory.class);
         Collection<Tag> tags = exif.getTags();
         Iterator<Tag> iter = tags.iterator();
         //逐個遍歷每個Tag
         while(iter.hasNext())
         {
          Tag tag = (Tag)iter.next();
          System.out.println(tag);
         }
         //檢查是否Tag中包含了圖片屬性-摘要中的作者 (xp)
         if(exif.containsTag(ExifIFD0Directory.TAG_WIN_AUTHOR)){
             System.out.println("Pic author is "+exif.getDescription(ExifIFD0Directory.TAG_WIN_AUTHOR));
         }
       //檢查是否Tag中包含了圖片屬性-摘要中的標題 (xp)
         if(exif.containsTag(ExifIFD0Directory.TAG_WIN_TITLE)){
             System.out.println("Pic title is "+exif.getDescription(ExifIFD0Directory.TAG_WIN_TITLE));
           }
       //檢查是否Tag中包含了圖片屬性-摘要中的主題 (xp)
           if(exif.containsTag(ExifIFD0Directory.TAG_WIN_SUBJECT )){
         System.out.println("Pic subject is "+exif.getDescription(ExifIFD0Directory.TAG_WIN_SUBJECT ));
         }
     }
}

執行結果:
[Exif IFD0] Make – NIKON
[Exif IFD0] Model – E990
[Exif IFD0] Orientation – Top, left side (Horizontal / normal)
[Exif IFD0] X Resolution – 300 dots per inch
[Exif IFD0] Y Resolution – 300 dots per inch
[Exif IFD0] Resolution Unit – Inch
[Exif IFD0] Software – E990v1.1
[Exif IFD0] Date/Time – 2000:12:30 10:18:16
[Exif IFD0] YCbCr Positioning – Datum point
[Exif IFD0] Windows XP Title – Codecho.com
[Exif IFD0] Windows XP Author – Leyond
[Exif IFD0] Windows XP Subject – Test
Pic author is Leyond
Pic title is Codecho.com
Pic subject is Test

其中后面三項分別是圖片屬性-摘要中的標題、主題、作者信息。當然你還可以讀取關鍵字(TAG_WIN_KEYWORDS)等信息。具體參考: Javadoc

 本文由用戶 nc6433 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!