package com.util;

import java.io.File;
import java.util.Iterator;

import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException;
import com.drew.metadata.exif.ExifDirectory;
import com.drew.metadata.exif.ExifReader;
public class ExifUtil {

public static void main(String[] args) {
try {

ExifReader er =new ExifReader(new File("填照片路径"));//也就用inputstream 或者二进制流
Metadata exif = er.extract();
Iterator itr = exif.getDirectoryIterator();
while (itr.hasNext()) {
Directory directory = (Directory) itr.next();
System.out.println(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.getDate(ExifDirectory.TAG_DATETIME_DIGITIZED));
System.out.println(directory.getDate(ExifDirectory.TAG_DATETIME_ORIGINAL));
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));
}
} catch (ImageProcessingException e) {
e.printStackTrace();
} catch (MetadataException e) {
e.printStackTrace();
}
}
}

下面给一个实体类,可以方便存储exif信息

package com.util;

import java.util.Date;

/**
* 照片信息
*/
public class Photo {
// EXIF版本
private String exifversion = null;
// 相机品牌
private String make = null;
// 相机型号
private String model = null;
// 光 圈 值
private String fnumber = null;
// 快 門
private String exposuretime = null;
// 感 光 度
private String isoequivalent = null;
// 软 件
private String software = null;
// 原始拍摄时间
private Date originaldatetime = null;
// 数字化时间
private Date digitizeddatetime = null;
// 方 向
private String orientation = null;
// 图片宽度
private String exifimagewidth = null;
// 图片高度
private String exifimageheight = null;
// 水平分辨率
private String xresolution = null;
// 垂直分辨率
private String yresolution = null;
// 曝光补偿
private String exposurebias = null;

public String getExifversion() {
return exifversion;
}

public void setExifversion(String exifversion) {
this.exifversion = exifversion;
}

public String getMake() {
return make;
}

public void setMake(String make) {
this.make = make;
}

public String getModel() {
return model;
}

public void setModel(String model) {
this.model = model;
}

public String getFnumber() {
return fnumber;
}

public void setFnumber(String fnumber) {
this.fnumber = fnumber;
}

public String getExposuretime() {
return exposuretime;
}

public void setExposuretime(String exposuretime) {
this.exposuretime = exposuretime;
}

public String getIsoequivalent() {
return isoequivalent;
}

public void setIsoequivalent(String isoequivalent) {
this.isoequivalent = isoequivalent;
}

public String getSoftware() {
return software;
}

public void setSoftware(String software) {
this.software = software;
}

public Date getOriginaldatetime() {
return originaldatetime;
}

public void setOriginaldatetime(Date originaldatetime) {
this.originaldatetime = originaldatetime;
}

public Date getDigitizeddatetime() {
return digitizeddatetime;
}

public void setDigitizeddatetime(Date digitizeddatetime) {
this.digitizeddatetime = digitizeddatetime;
}

public String getOrientation() {
return orientation;
}

public void setOrientation(String orientation) {
this.orientation = orientation;
}

public String getExifimagewidth() {
return exifimagewidth;
}

public void setExifimagewidth(String exifimagewidth) {
this.exifimagewidth = exifimagewidth;
}

public String getExifimageheight() {
return exifimageheight;
}

public void setExifimageheight(String exifimageheight) {
this.exifimageheight = exifimageheight;
}

public String getXresolution() {
return xresolution;
}

public void setXresolution(String xresolution) {
this.xresolution = xresolution;
}

public String getYresolution() {
return yresolution;
}

public void setYresolution(String yresolution) {
this.yresolution = yresolution;
}

public String getExposurebias() {
return exposurebias;
}

public void setExposurebias(String exposurebias) {
this.exposurebias = exposurebias;
}

@Override
public String toString() {
return "数字化时间:" + digitizeddatetime
+ ", 图片高度:" + exifimageheight + ", 图片宽度:"
+ exifimagewidth + ", EXIF版本:" + exifversion
+ ",曝光补偿:" + exposurebias + ", 快 門:"
+ exposuretime + ", 光 圈 值:" + fnumber + ", 感 光 度:"
+ isoequivalent + ", 相机品牌:" + make + ", 相机型号:" + model
+ ", 方 向:" + orientation + ", 原始拍摄时间:"
+ originaldatetime + ", 软 件:" + software
+ ", 水平分辨率:" + xresolution + ", 垂直分辨率:"
+ yresolution ;
}

}

metadata-extractor-2.4.0-beta-1.jar

使用Java程序读取JPG Tif等格式图片的exif信息的更多相关文章

  1. 用C#读取图片的EXIF信息的方法

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...

  2. C#读取MP3文件的专辑图片和ID3V2Tag信息(带代码)

    第二次更新,后面的代码有问题,有些专辑图片读取不到.发现是PNG图片的问题.在读取的过程中调试发现,图片帧前10个字节包含了图片的格式,在有些歌曲写着JPEG的格式,数据却是PNG的.先说下思路. j ...

  3. Java程序读取Properties文件

    一.如果将properties文件保存在src目录下 1.读取文件代码如下: /** * 配置文件为settings.properties * YourClassName对应你类的名字 * / pri ...

  4. 我的第八个java程序--读取word内容

    package World; import java.io.FileNotFoundException; import java.io.IOException; import org.apache.p ...

  5. Java程序读取tomcat下的properties配置文件

    代码如下: //找到tomcat/etc/wx文件夹    private static String getPropFolderPath()    {  /* Properties p = Syst ...

  6. Java中读取txt文件中中文字符时,出现乱码的解决办法

    这是我写的一个Java课程作业时,遇到的问题. 问题描述: 我要实现的就是将txt文件中的内容按一定格式读取出来后,存放在相应的数组. 我刚开始运行时发现,英文可以实现,但是中文字符就是各种乱码. 最 ...

  7. java程序员应该熟悉的20个有用的库(转)

    优秀且经验丰富的Java开发人员的一个特点是API的广泛知识,包括JDK和第三方库.我花了很多时间学习API,特别是在阅读Effective Java 3rd Edition之后,Joshua Blo ...

  8. Java程序员应该知道的20个有用的lib开源库

    一般一个经验丰富的开发者,一般都喜欢使用开源的第三方api库来进行开发,毕竟这样能够提高开发效率,并且能够简单快速的集成到项目中去,而不用花更多的时间去在重复造一些无用的轮子,多了解一些第三方库可以提 ...

  9. 五种方式让你在java中读取properties文件内容不再是难题

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

随机推荐

  1. TCP-IP详解笔记6

    TCP-IP详解笔记6 用户数据报协议和IP分片 UDP是一种保留消息边界的面向数据报的传输层协议. 不提供差错纠正, 队列管理, 重复消除, 流量控制和拥塞控制. 提供差错检测, 端到端(end-t ...

  2. C++设计模式——状态模式

    前言 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的. typedef enum tagState { state, st ...

  3. CentOS6配置Taiga

    背景 企业项目管理是一个比较复杂的事情,这个市场需求非常大,目前市面上也存在着teambition,tower等平台,但是这些工具平台目前都是付费才能有完整的功能,免费版根本不能满足团队的需求.一番调 ...

  4. pandas 中的模糊匹配

  5. django 实战篇之模板层

    模板层 ​ {{}} 变量相关 ​ {%%} 逻辑相关 ​ 前端获取容器类型的数据统一使用 句点符(.) ​ 两种给模板传递值的方式 return render(request,'index.html ...

  6. CSS选择器权重计算

    CSS各种选择器的权重: 1.ID选择器  +100 2.类.属性.伪类选择器   +10 3.元素.伪元素选择器   +1 4.其他选择器   +0 如果有两个CSS样式都作用于某元素,如: #id ...

  7. jquery 第五章 jQuery操作表单与表格

    1.回顾 对象.bind("事件名称",function(){ // }) 阻止冒泡事件 return false,   event stopProapagation() 模拟事件 ...

  8. sass进阶—mixin的使用(浏览器兼容性调整)

    @mixin content($color:red,$fontSize:14px){ color:$color; font-size: $fontSize;} /*调用含参数的mixin,使用更加灵活 ...

  9. IE9以及以下不支持jquery ajax跨域问题

    1.代码中加 jQuery.support.cors = true; 2. 设置ie浏览器 工具->Internet 选项->安全->自定义级别” 将“其他”选项中的“通过域访问数据 ...

  10. oracle 列行转换

    1.列转换  1:每个字母转成一行 SELECT SUBSTR(A.COLUMN1, LEV, 1) COLUMN1FROM (     SELECT 'AABDC' COLUMN1 FROM DUA ...