Java获取图片EXIF格式的元数据

标签: java 图片 exif | 发表时间:2015-05-26 14:45 | 作者:最王座
出处:http://www.iteye.com

一、引言
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就可以读取到相应的信息
			Iterable<Directory> iterable = metadata.getDirectories();
			for (Iterator<Directory> iter = iterable.iterator();iter.hasNext();) {
				Directory dr = iter.next();
				Collection<Tag> 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

 





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 图片 exif] 推荐:

Java获取图片EXIF格式的元数据

- - Java - 编程语言 - ITeye博客
Java中要取得一张图片的exif(Exchangeable Image File, 可交换图像文件)信息. 比如:拍摄时间,拍摄设备型号,焦距,曝光时间等. 通过开源Jar包metadata-extractor-2.8.1.jar、xmpcore-5.1.2.jar中提供的类就可以获取到以上信息.

使用 metadata-extractor 解析图片 exif 元数据信息

- - ITeye博客
//光圈F值=镜头的焦距/镜头光圈的直径. System.out.println("光圈值: f/" + directory.getString(ExifSubIFDDirectory.TAG_FNUMBER) );. System.out.println("曝光时间: " + directory.getString(ExifSubIFDDirectory.TAG_EXPOSURE_TIME)+ "秒" );.

EXIF Viewer 瀏覽器內快速查看線上攝影照片的EXIF資訊

- 小趴 八足趴 八足 ramener - 電腦玩物
最近開始喜歡看一些攝影部落格,也開始除了純觀賞外,還會想了解這張精采照片背後的一些技術數值,也就是一般所說的EXIF資訊. 如果是瀏覽Picasa、Flickr這些相簿社群時,網站本身就會內建查看EXIF資訊的功能,但如果是在其他網站裡看到的照片分享,就不一定能夠簡便的看到深入的數據. 不過,像是「查看相片EXIF資訊」這種簡單的需求,一定是有很多套件可以滿足的.

Java图片加水印

- - CSDN博客推荐文章
pressText("真的好想你","3.jpg","宋体",Font.BOLD,0,20,200,200);. 作者:cjc211322 发表于2014-12-4 8:35:45 原文链接. 阅读:59 评论:0 查看评论.

java图片处理工具

- - CSDN博客推荐文章
作者:kuanghongjiang 发表于2015-2-1 15:45:51 原文链接. 阅读:0 评论:0 查看评论.

JAVA上传图片的缩放处理

- - CSDN博客推荐文章
  图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理.   下面的程序使用jdk1.4中最新的ImageIO对图片进行读写. 使用AffineTransform对图片进行缩放.   * @param fromdir 图片的原始目录.

Java中图片压缩处理

- - 编程语言 - ITeye博客
整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你可以使用bmp、png、gif等,至于压缩质量,可以通过BufferedImage来指定. 在C盘的temp下放置一张图片pic123.jpg,尽量找一个像素高一点的图片,这里我找了一张5616*3744的.

java图片裁切工具类

- - CSDN博客编程语言推荐文章
* @param x1 选择区域左上角的x坐标. * @param y1 选择区域左上角的y坐标. * @param width 选择区域的宽度. * @param height 选择区域的高度. * @param sourcePath 源图片路径. * @param descpath 裁切后图片的保存路径.

Java的图片处理工具类

- - CSDN博客推荐文章
Java的图片处理工具类: 可实现以下常用功能:缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等. public static String IMAGE_TYPE_GIF = "gif";// 图形交换格式. public static String IMAGE_TYPE_JPG = "jpg";// 联合照片专家组.

JAVA实现对BMP图片的读取

- - ITeye博客
BMP图片格式,是windows自带的一个图片格式,(*bmp),在windows的系统下都支持这种格式,bmp格式与设备无关的位图(DIB)格式,BMP简称位图,BMP的原始数据是没有经过压缩处理的  占用的空间比其它格式的图片要大.    BMP由四部分组成 ,位图文件头 , 位图信息头 ,  颜色 , 图像数据区.