一、引言
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
相关推荐
在Java编程语言中,获取图片的EXIF(Exchangeable Image File Format)信息是一项常见的任务,尤其是在处理图像数据或开发图像处理应用时。EXIF信息包含了拍摄照片时的各种元数据,如相机型号、拍摄时间、曝光参数、...
这篇博客文章“JAVA获取图片EXIF等综合信息并转化为JSON”提供了一个实用的方法来处理这一需求。EXIF信息通常存储在JPEG和TIFF格式的图像文件中,包含了丰富的设备信息和拍摄参数。 首先,我们需要引入一个能够读取...
首先,metadata-extractor是一个开源的Java库,它能够从各种文件格式中提取元数据,包括JPEG、TIFF和HEIC等。要使用这个库,你需要将`metadata-extractor-2.3.1.jar`添加到你的项目类路径中。如果你使用Maven或...
使用`MetadataExtractor`,你可以轻松地读取图片文件中的EXIF元数据。以下是一个简单的示例代码,演示如何读取并打印所有EXIF标签: ```java import com.drewnoakes.metadata.exif.ExifIFD0Directory; import ...
这些信息随后被存储在JPEG、TIFF等图像文件的头部,形成Exif元数据。 获取Exif信息的方法有多种。在编程领域,我们可以使用各种语言的库或模块来读取Exif数据。例如,在Python中,有`PIL`(Python Imaging Library...
总结来说,要从Java程序中获取相片的EXIF信息并进行自动缩放,可以使用`metadata-extractor`库读取元数据,结合`BufferedImage`和`Graphics2D`实现图像的缩放操作。这两个步骤可以集成到一个完整的图像处理流程中,...
Java的`java.io.File`类提供了获取文件元数据的方法,如`length()`获取文件大小,`lastModified()`获取最后修改时间,`exists()`检查文件是否存在。对于更复杂的元数据需求,可以使用NIO.2(New IO)中的`java.nio....
总之,通过使用Apache Commons Imaging库,Java开发者可以方便地读取和处理图像文件的EXIF数据,从而实现各种功能,如照片的元数据分析、图片管理、信息提取等。了解并熟练掌握这一技术对于从事与图像处理相关的IT...
总的来说,Java通过第三方库或自定义的`mediautil`库,为开发者提供了强大的能力来处理和修改图片的Exif元数据。这在各种应用场景中都非常有用,例如在社交媒体分享、图像管理软件或照片编辑工具中。了解和掌握这一...
Exif(Exchangeable Image File ...通过理解以上知识点,你可以创建一个服务,用户可以上传图片,然后服务会提取Exif元数据并显示或保存。这在许多场景下都非常有用,比如图片管理系统、社交媒体分析、摄影社区等。
Exif(Exchangeable Image File Format)是一种用于存储数码照片元数据的标准格式,它在JPEG、TIFF以及其他图像文件中广泛使用。Exif信息通常包含了拍摄照片时的各种详细参数,如拍摄日期和时间、相机型号、曝光时间...
### 修改图片EXIF信息示例(使用MediaUtil) #### 一、引言 在数字图像处理领域,EXIF(Exchangeable Image File Format)是一种标准格式,用于存储图像文件中的元数据,包括拍摄时间、相机型号、光圈值、快门速度...
- EXIF是专门为数码相机照片设计的一种元数据格式,用于存储拍摄时的相机设置和环境信息。 - 主要信息包括:相机品牌和型号、拍摄时间、光圈大小、快门速度、ISO感光度、焦距、曝光模式、白平衡等。 - 支持EXIF的...
例如,通过`ImageIO.read(file)`加载图片后,我们可以调用`IIOMetadata`的`getNativeMetadataFormatNames()`方法获取Exif格式的元数据,然后解析其中的GPS信息。 核心知识点二:解析Exif信息 Java的`...
- 使用`ImageMetadataReader.readMetadata(file)`获取图片的元数据。 - 遍历`Metadata`对象中的所有`Directory`对象。 - 对于每个`Directory`对象,遍历其包含的所有`Tag`对象,并打印出标签名和描述。 ##### 3. **...
例如,你可以获取图像的宽度和高度、旋转角度,以及与照片拍摄相关的各种元数据。这些信息对于图像处理、地理标记或创建元数据丰富的应用非常有用。 在实际应用中,为了提高性能,应考虑使用异步操作来读取Exif信息...
在这个场景中,提到的两个库——`metadata-extractor-2.8.1.jar`和`xmpcore-5.1.2.jar`,是用于读取图片元数据的关键工具。 1. **metadata-extractor**: `metadata-extractor`是一个强大的开源库,由Drew Noakes...
然后,我们可以使用`getNativeMetadataFormatNames()`方法找到Exif相关的元数据格式,接着使用`getMetadataTree(String formatName)`获取Exif树结构。 在Exif元数据树中,GPS信息通常位于`{...
在数字图像处理领域,EXIF(Exchangeable Image File Format)信息是照片文件中存储的重要元数据,它记录了拍摄时的相机设置、时间戳、地理位置等信息。在某些情况下,我们可能需要对这些信息进行修改,例如保护隐私...