java 读取图片的 Exif 数据

2010年1月15日 | 分类: Java | 标签: ,

首先了解什么是 EXIF

Exif是英文Exchangeable Image File(可交换图像文件)的缩写,最初由日本电子工业发展协会(JEIDA –Japan Electronic

Industry Development Association) 制订,目前的最新版本是发表于2002年04月的2.21 版。
Exif 文件实际是JPEG文件的一种,遵从JPEG标准,只是在文件头信息中增加了有关拍摄信息的内容和索引图。所以你可以使用任何支持JPEG格式的图像工具软件观看或修改Exif文件,但,打开时可能看不到Exif信息,一旦修改,Exif信息可能丢失。简单来说,EXIF 信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部,也就是说 EXIF 信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。简单的说,它就好像是傻瓜相机的日期打印功能一样,只不过 EXIF 信息所记录的资讯更为详尽和完备。

Exif 文件包含的信息

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压缩比。

java 读取图片的 Exif 数据代码
package image.read;
import com.drew.metadata.*;
import com.drew.metadata.exif.*;
import com.drew.imaging.jpeg.JpegProcessingException;
import java.io.*;
import java.util.Iterator;

public class EXIFReader {

public static void main(String args[]) throws FileNotFoundException {
File f = new File(“c:\\b.jpg”);
try {
ExifReader er = new ExifReader(f);
Metadata exif = er.extract();
Iterator itr = exif.getDirectoryIterator();
while (itr.hasNext()) {
Directory directory = (Directory) itr.next();

System.out.println(“EXIF版本:”+ directory.getString(ExifDirectory.TAG_EXIF_VERSION));
System.out.println(“相机品牌:”+ directory.getString(ExifDirectory.TAG_MAKE));
System.out.println(“相机型号:”+ directory.getString(ExifDirectory.TAG_MODEL));
System.out.println(“光 圈 值:”+ directory.getString(ExifDirectory.TAG_FNUMBER));
System.out.println(“快    門:”+ directory.getString(ExifDirectory.TAG_EXPOSURE_TIME));
System.out.println(“感 光 度:”+ directory.getString(ExifDirectory.TAG_ISO_EQUIVALENT));
System.out.println(“软    件:”+ directory.getString(ExifDirectory.TAG_SOFTWARE));
System.out.println(“原始拍摄时间:”+ directory.getString(ExifDirectory.TAG_DATETIME_ORIGINAL));
System.out.println(“数字化时间:”+ directory.getString(ExifDirectory.TAG_DATETIME_DIGITIZED));
System.out.println(“方    向:”+ directory.getString(ExifDirectory.TAG_ORIENTATION));
System.out.println(“图片宽度:”+ directory.getString(ExifDirectory.TAG_EXIF_IMAGE_WIDTH));
System.out.println(“图片高度:”+ directory.getString(ExifDirectory.TAG_EXIF_IMAGE_HEIGHT));
System.out.println(“水平分辨率:”+ directory.getString(ExifDirectory.TAG_X_RESOLUTION));
System.out.println(“垂直分辨率:”+ directory.getString(ExifDirectory.TAG_Y_RESOLUTION));
System.out.println(“垂直分辨率:”+ directory.getString(ExifDirectory.TAG_EXPOSURE_BIAS));
break;

// 获得全部metadata
/*
* Iterator tags = directory.getTagIterator(); while
* (tags.hasNext()) { Tag tag = (Tag) tags.next();
* System.out.println(tag); } if (directory.hasErrors()) {
* Iterator errors = directory.getErrors(); while
* (errors.hasNext()) { System.out.println(“ERROR:   ” +
* errors.next()); } }
*/
}
} catch (JpegProcessingException e) {
System.err.println(“not   jpeg   file”);
}
}

}

  1. 2010年1月19日22:41

    需要 com.drew.* 的包
    你在FF下编辑代码?这样会导致格式全部丢失的

    • 2010年1月19日22:45

      是啊,是在FF下,用的发芽网编辑代码,这个包很难下的。。。

本文的评论功能被关闭了.