Java获取图像Exif信息
2015-06-07 22:44
603 查看
Exif(Exchangeable Image File)是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。在Windows
系统中,对图像文件右键选择“属性”,在“详细信息”选项卡中可以查看Exif值,但这些值并不全面,想要查看完整的Exif信息,需要下载专业的Exif信息查看器。
用Java实现一个Exif查看器,需要借助开源项目metadata-extractor,你可以在https://drewnoakes.com/code/exif/中查看该项目的详细信息。
导入jar包
项目需要两个jar包:
metadata-extractor-2.8.1.jar,
xmpcore-5.1.2.jar
你可以在https://github.com/drewnoakes/metadata-extractor/releases下载这两个jar包。
通常情况下,使用Metadata metadata = ImageMetadataReader.readMetadata(file);
就可以满足大多数需求。该方法知用于不确定图像格式的情况,该方法会自动确定图像的格式,返回一个Metadata对象。支持JPEG, TIFF, GIF, BMP 和RAW等大多数格式。
如果知道确切的图像格式,如JPEG、BMP等,就可以使用JpegMetadataReader或BmpMetadataReader来获得Metadata对象,如:
Metadata metadata = JpegMetadataReader.readMetadata(file);
当然,如果你只希望读取无数据类型的一个子集,你可以指定一个Reader,如:只处理JPEG类型:
Iterable<JpegSegmentMetadataReader> readers = Arrays.asList(new ExifReader(), new IptcReader());
Metadata metadata = JpegMetadataReader.readMetadata(file, readers);
下面我们使用第一种方式给出一个完整的例子:
import com.drew.imaging.ImageMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import java.io.File;
public class SampleUsage
{
public static void main(String[] args)
{
File file = new File("N:/ls.jpg");
try
{
Metadata metadata = ImageMetadataReader.readMetadata(file);
print(metadata);
}
catch (Exception e)
{
e.printStackTrace();
}
}
private static void print(Metadata metadata)
{
for (Directory directory : metadata.getDirectories())
{
for (Tag tag : directory.getTags())
{
System.out.print(tag.getTagName() + " --> ");
System.out.println(tag.getDescription());
}
if (directory.hasErrors())
{
for (String error : directory.getErrors())
{
System.err.println("ERROR: " + error);
}
}
}
}
}
输出结果如下(部分):
Make --> Canon
Model --> Canon EOS 700D
Orientation --> Top, left side (Horizontal / normal)
X Resolution --> 72 dots per inch
Y Resolution --> 72 dots per inch
Resolution Unit --> Inch
Software --> Adobe Photoshop CS6 (Windows)
Date/Time --> 2015:05:18 16:01:01
Artist --> Songlin
YCbCr Positioning --> Datum point
前面是参数的名称,后面是参数的值,如Make参数(厂商),对应的值是Canon(佳能)。常见的Exif参数如下表:
系统中,对图像文件右键选择“属性”,在“详细信息”选项卡中可以查看Exif值,但这些值并不全面,想要查看完整的Exif信息,需要下载专业的Exif信息查看器。
用Java实现一个Exif查看器,需要借助开源项目metadata-extractor,你可以在https://drewnoakes.com/code/exif/中查看该项目的详细信息。
导入jar包
项目需要两个jar包:
metadata-extractor-2.8.1.jar,
xmpcore-5.1.2.jar
你可以在https://github.com/drewnoakes/metadata-extractor/releases下载这两个jar包。
通常情况下,使用Metadata metadata = ImageMetadataReader.readMetadata(file);
就可以满足大多数需求。该方法知用于不确定图像格式的情况,该方法会自动确定图像的格式,返回一个Metadata对象。支持JPEG, TIFF, GIF, BMP 和RAW等大多数格式。
如果知道确切的图像格式,如JPEG、BMP等,就可以使用JpegMetadataReader或BmpMetadataReader来获得Metadata对象,如:
Metadata metadata = JpegMetadataReader.readMetadata(file);
当然,如果你只希望读取无数据类型的一个子集,你可以指定一个Reader,如:只处理JPEG类型:
Iterable<JpegSegmentMetadataReader> readers = Arrays.asList(new ExifReader(), new IptcReader());
Metadata metadata = JpegMetadataReader.readMetadata(file, readers);
下面我们使用第一种方式给出一个完整的例子:
import com.drew.imaging.ImageMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import java.io.File;
public class SampleUsage
{
public static void main(String[] args)
{
File file = new File("N:/ls.jpg");
try
{
Metadata metadata = ImageMetadataReader.readMetadata(file);
print(metadata);
}
catch (Exception e)
{
e.printStackTrace();
}
}
private static void print(Metadata metadata)
{
for (Directory directory : metadata.getDirectories())
{
for (Tag tag : directory.getTags())
{
System.out.print(tag.getTagName() + " --> ");
System.out.println(tag.getDescription());
}
if (directory.hasErrors())
{
for (String error : directory.getErrors())
{
System.err.println("ERROR: " + error);
}
}
}
}
}
输出结果如下(部分):
Make --> Canon
Model --> Canon EOS 700D
Orientation --> Top, left side (Horizontal / normal)
X Resolution --> 72 dots per inch
Y Resolution --> 72 dots per inch
Resolution Unit --> Inch
Software --> Adobe Photoshop CS6 (Windows)
Date/Time --> 2015:05:18 16:01:01
Artist --> Songlin
YCbCr Positioning --> Datum point
前面是参数的名称,后面是参数的值,如Make参数(厂商),对应的值是Canon(佳能)。常见的Exif参数如下表:
代码 | 英文解释 | 中文解释 |
0x0000 | GPS Version ID | GPS版本 |
0x010f | Make | 厂商 |
0x0110 | Model | 机型 |
0x0112 | Orientation | 方向 |
0x0131 | Software | 软件 |
0x0132 | Date/Time | 修改时间 |
0x013b | Artist | 作者 |
0x0213 | YCbCr Positioning | YcbCr定位 |
0x829a | Exposure Time | 曝光时间 |
0x829d | F-Number | 光圈 |
0x8822 | Exposure Program | 曝光程序 |
0x8827 | ISO Speed Ratings | ISO感光度 |
0x9000 | Exif Version | Exif版本 |
0x9003 | Date/Time Original | 拍摄时间 |
0x9004 | Date/Time Digitized | 数字化时间 |
0x9101 | Components Configuration | 成分构成 |
0x9201 | Shutter Speed Value | 快门速度 |
0x9202 | Aperture Value | 光圈值 |
0x9204 | Exposure Bias Value | 曝光补偿 |
0x9205 | Max Aperture Value | 最大光圈 |
0x9207 | Metering Mode | 测光模式 |
0x9209 | Flash | 闪光 |
0x920a | Focal Length | 焦距 |
0x9286 | User Comment | 用户注释 |
0x9290 | Sub-Sec Time | 次秒(修改时间) |
0x9291 | Sub-Sec Time Original | 次秒(拍摄时间) |
0x9292 | Sub-Sec Time Digitized | 次秒(数字化时间) |
0xa000 | FlashPix Version | FlashPix版本 |
0xa001 | Color Space | 色彩空间 |
0xa002 | Exif Image Width | Exif图像宽度 |
0xa003 | Exif Image Height | Exif图像高度 |
0xa20e | Focal Plane X Resolution | 焦平面水平分辨率 |
0xa20f | Focal Plane Y Resolution | 焦平面垂直分辨率 |
0xa210 | Focal Plane Resolution Unit | 焦平分辨率单位 |
0xa401 | Custom Rendered | 自定义补偿 |
0xa402 | Exposure Mode | 曝光模式 |
0xa403 | White Balance Mode | 白平衡 |
0xa406 | Scene Capture Type | 场景拍摄类型 |
0x0001 | Interoperability Index | 可交换标准 |
0x0002 | Interoperability Version | 可交换版本 |
0x0103 | Thumbnail Compression | 压缩模式 |
0x0201 | Thumbnail Offset | JPEG缩略图起始位置 |
0x0202 | Thumbnail Length | JPEG缩略图数据长度 |
0x011a | X Resolution | 水平分辨率 |
0x011b | Y Resolution | 垂直分辨率 |
0x0128 | Resolution Unit | 分辨率单位 |
0x0131 | Software | 软件 |
0x0006 | Lens Information | 镜头信息 |
0x0007 | Lens | 镜头 |
相关文章推荐
- PhotoShop给图片自动添加边框及EXIF信息的JS脚本
- PHP exif扩展方法开启详解
- python让图片按照exif信息里的创建时间进行排序的方法
- python用来获得图片exif信息的库实例分析
- Python读取图片EXIF信息类库介绍和使用实例
- python通过pil模块获得图片exif信息的方法
- git常用命令
- openstack扩展方法
- Oracle 建库脚本导出
- OSGi入门篇:生命周期层
- SQL Server 2012中的Contained Database尝试
- 快速修改JPEG文件的旋转角度(通过修改exif信息)
- eclipse无法启动的各种解决方法
- Android获取包名,版本号,以及AndroidManifest.xml不同元素下的 <meta-data>的值
- org.eclipse.wst.common.project.facet.core.xml读不到
- Java Annotation基础
- 百度云上传图片
- android 如何判断有没有网络
- android http pos 请求和gson解析处理head头信息
- FlashBuilder 4.7 非正常关闭导致的不能启动的解决办法