一、引言
Java中要取得一张图片的exif(Exchangeable Image File, 可交换图像文件)信息。比如:拍摄时间,拍摄设备型号,焦距,曝光时间等。
通过开源Jar包metadata-extractor-2.8.1.jar、xmpcore-5.1.2.jar中提供的类就可以获取到以上信息。
二、示例代码
1) 示例1
package com.wbf.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.Iterator; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.ImageProcessingException; import com.drew.metadata.Directory; import com.drew.metadata.Metadata; import com.drew.metadata.Tag; public class Demo01 { public static void main(String[] args) { File imgFile = new File("d:" + File.separator + "001.jpg"); InputStream is = null; try { is = new FileInputStream(imgFile); } catch (FileNotFoundException e1) { e1.printStackTrace(); } try { //核心对象操作对象 Metadata metadata = ImageMetadataReader.readMetadata(is); //获取所有不同类型的Directory,如ExifSubIFDDirectory, ExifInteropDirectory, ExifThumbnailDirectory等,这些类均为ExifDirectoryBase extends Directory子类 //分别遍历每一个Directory,根据Directory的Tags就可以读取到相应的信息 Iterableiterable = metadata.getDirectories(); for (Iterator iter = iterable.iterator();iter.hasNext();) { Directory dr = iter.next(); Collection tags = dr.getTags(); for (Tag tag : tags) { System.out.println(tag.getTagName() + ", " + tag.getDescription()); } } } catch (ImageProcessingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
运行结果:
Exposure Time, 100002/1000000 sec
F-Number, f/2.0
Exposure Program, Unknown (0)
ISO Speed Ratings, 487
Exif Version, 2.20
Date/Time Original, 2015:05:20 11:02:22
Date/Time Digitized, 2015:05:20 11:02:22
Components Configuration, YCbCr
Exposure Bias Value, 0 EV
Metering Mode, Center weighted average
White Balance, (Other)
Flash, Flash fired
Focal Length, 3.5 mm
FlashPix Version, 1.00
Color Space, sRGB
Exif Image Width, 2736 pixels
Exif Image Height, 4864 pixels
Exposure Mode, Auto exposure
White Balance Mode, Auto white balance
Digital Zoom Ratio, 1
Scene Capture Type, Standard
Image Description,
Make, Yulong
Model, 8297
Orientation, Top, left side (Horizontal / normal)
X Resolution, 72 dots per inch
Y Resolution, 72 dots per inch
Resolution Unit, Inch
Software, MediaTek Camera Application
Date/Time, 2015:05:20 11:02:22
YCbCr Positioning, Datum point
Unknown tag (0x0220), 0
Unknown tag (0x0221), 0
Unknown tag (0x0222), 0
Unknown tag (0x0223), 0
Interoperability Index, Recommended Exif Interoperability Rules (ExifR98)
Interoperability Version, 1.00
Compression Type, Baseline
Data Precision, 8 bits
Image Height, 4864 pixels
Image Width, 2736 pixels
Number of Components, 3
Component 1, Y component: Quantization table 0, Sampling factors 1 horiz/2 vert
Component 2, Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert
Component 3, Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert
Thumbnail Compression, JPEG (old-style)
Orientation, Top, left side (Horizontal / normal)
X Resolution, 72 dots per inch
Y Resolution, 72 dots per inch
Resolution Unit, Inch
Thumbnail Offset, 1137 bytes
Thumbnail Length, 9856 bytes
YCbCr Positioning, Datum point
2) 示例2
package com.wbf.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.ImageProcessingException; import com.drew.metadata.Directory; import com.drew.metadata.Metadata; import com.drew.metadata.Tag; import com.drew.metadata.exif.ExifSubIFDDirectory; public class Demo02 { public static void main(String[] args) { File imgFile = new File("d:" + File.separator + "001.jpg"); InputStream is = null; try { is = new FileInputStream(imgFile); } catch (FileNotFoundException e1) { e1.printStackTrace(); } try { //核心对象操作对象 Metadata metadata = ImageMetadataReader.readMetadata(is); //metadata对象会根据不同类型的图片,生成不同的Directory //除了可以遍历所有的Directory来获取对象的tag信息,如果你只是需要其中部分tag信息,可以获取其中指定类型的Directory,如:ExifSubIFDDirectory Directory dr = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class); for (Tag tag : dr.getTags()) { System.out.println(tag.getTagName() + ", " + tag.getDescription()); } } catch (ImageProcessingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
运行结果:
Exposure Time, 100002/1000000 sec
F-Number, f/2.0
Exposure Program, Unknown (0)
ISO Speed Ratings, 487
Exif Version, 2.20
Date/Time Original, 2015:05:20 11:02:22
Date/Time Digitized, 2015:05:20 11:02:22
Components Configuration, YCbCr
Exposure Bias Value, 0 EV
Metering Mode, Center weighted average
White Balance, (Other)
Flash, Flash fired
Focal Length, 3.5 mm
FlashPix Version, 1.00
Color Space, sRGB
Exif Image Width, 2736 pixels
Exif Image Height, 4864 pixels
Exposure Mode, Auto exposure
White Balance Mode, Auto white balance
Digital Zoom Ratio, 1
Scene Capture Type, Standard
三、补充说明
1) 解释部分参数的实际意思
项目
|
资讯
|
制造厂商
|
Canon
|
相机型号
|
Canon EOS-1D Mark II
|
影像方向
|
正常(upper-left)
|
影像分辨率 X
|
72
|
影像分辨率 Y
|
72
|
分辨率单位
|
dpi
|
Software
|
Adobe Photoshop CS Macintosh
|
最后异动时间
|
2005:10:06 12:53:19
|
YCbCrPositioning
|
2
|
曝光时间
|
0.00800 (1/125) sec
|
光圈值
|
F1.6
|
拍摄模式
|
光圈优先
|
ISO 感光值
|
100
|
EXIF 资讯版本
|
30,32,32,31
|
影像拍摄时间
|
2005:09:25 15:00:18
|
影像存入时间
|
2005:09:25 15:00:18
|
曝光补偿(EV+-)
|
0
|
测光模式
|
点测光 (Spot)
|
闪光灯
|
关闭
|
镜头实体焦长
|
85 mm
|
Flashpix 版本
|
30,31,30,30
|
影像色域空间
|
sRGB
|
影像尺寸 X
|
800 pixel
|
影像尺寸 Y
|
533 pixel
|
Make 生产者 指产品生产厂家
Model 型号 指设备型号
Orientation 方向 有的相机支持,有的不支持
X Resolution/Y Resolution X/Y方向分辨率 本栏目已有专门条目解释此问题。
ResolutionUnit 分辨率单位 一般为PPI
Software 软件 显示固件Firmware版本
DateTime 日期和时间
YCbCrPositioning 色相定位
ExifOffsetExif 信息位置,定义Exif在信息在文件中的写入,有些软件不显示。
ExposureTime 曝光时间 即快门速度
FNumber 光圈系数
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) 图像高度 指纵向像素数
2) metadata-extractor-2.8.1.jar、xmpcore-5.1.2.jar
这两个jar包,最早大家使用的版本metadata-extractor-2.3.1.jar,但是这个版本可以处理的图片类型有限似乎只有jpg,2.8.1就已经做了完善,可以处理的图片格式如下:
- JPEG
- TIFF
- PSD
- PNG
- BMP
- GIF
- Camera Raw (NEF/CR2/ORF/ARW/RW2/...)
对于 xmpcore-5.1.2.jar是2.8.1的依赖jar包。
另外附上metadata-extractor的github主页:https://github.com/drewnoakes/metadata-extractor