java读取JPEG中exif中信息

一般的相机会记录一些图片基本信息之外的扩展信息,例如,经纬度信息,存储与exif中,如下图!

一般情况下是java程序读取不到gps等扩展信息的。如果想要解析到里面的信息需要下载一个jar包,metadata-extractor-2.6.4.jar(下载地址:http://code.google.com/p/metadata-extractor/),这个jar提供了支持获取扩展信息的功能。

具体实现的代码如下:

package com.drew.metadata;

import java.io.File;
import java.io.IOException;

import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;

public class SampleUsage
{
   /**
    * 图片信息获取metadata元数据信息
    * @param fileName 需要解析的文件
    * @return
    */
    public ImgInfoBean parseImgInfo (String fileName)
    {
        File file = new File(fileName);
        ImgInfoBean imgInfoBean = null;
        try {
            Metadata metadata = ImageMetadataReader.readMetadata(file);
            imgInfoBean = printImageTags(file, metadata);
        } catch (ImageProcessingException e) {
            System.err.println("error 1a: " + e);
        } catch (IOException e) {
            System.err.println("error 1b: " + e);
        }
        return imgInfoBean;
    }

    /**
     * 读取metadata里面的信息
     * @param sourceFile 源文件
     * @param metadata metadata元数据信息
     * @return
     */
    private ImgInfoBean printImageTags(File sourceFile, Metadata metadata)
    {
        ImgInfoBean imgInfoBean = new ImgInfoBean ();
        imgInfoBean.setImgSize(sourceFile.getTotalSpace());
        imgInfoBean.setImgName(sourceFile.getName());
        for (Directory directory : metadata.getDirectories()) {
            for (Tag tag : directory.getTags()) {
            	String tagName = tag.getTagName();
            	String desc = tag.getDescription();
				if (tagName.equals("Image Height")) {
					//图片高度
					imgInfoBean.setImgHeight(desc);
				} else if (tagName.equals("Image Width")) {
					//图片宽度
					imgInfoBean.setImgWidth(desc);
				} else if (tagName.equals("Date/Time Original")) {
					//拍摄时间
					imgInfoBean.setDateTime(desc);
				} else if (tagName.equals("GPS Altitude")) {
					//海拔
					imgInfoBean.setAltitude(desc);
				} else if (tagName.equals("GPS Latitude")) {
					//纬度
					imgInfoBean.setLatitude(pointToLatlong(desc));
				} else if (tagName.equals("GPS Longitude")) {
					//经度
					imgInfoBean.setLongitude(pointToLatlong(desc));
				}
            }
            for (String error : directory.getErrors()){
            	System.err.println("ERROR: " + error);
            }
        }
        return imgInfoBean;
    }

    /**
     * 经纬度转换  度分秒转换
     * @param point 坐标点
     * @return
     */
    public String pointToLatlong (String point ) {
    	Double du = Double.parseDouble(point.substring(0, point.indexOf("°")).trim());
    	Double fen = Double.parseDouble(point.substring(point.indexOf("°")+1, point.indexOf("'")).trim());
    	Double miao = Double.parseDouble(point.substring(point.indexOf("'")+1, point.indexOf("\"")).trim());
    	Double duStr = du + fen / 60 + miao / 60 / 60 ;
    	return duStr.toString();
    }
   
    public static void main(String[] args)
    {
        ImgInfoBean imgInfoBean = new SampleUsage().parseImgInfo("C:\\DSC_4564.JPG");
        System.out.println(imgInfoBean.toString());
    }
}

文件信息bean类。

package com.drew.metadata;

public class ImgInfoBean {

	private String imgHeight ;//图片高度
	private String imgWidth ;//图片宽度
	private String dateTime ;//拍摄时间
	private String altitude ;//海拔
	private String latitude;//纬度
	private String longitude ;//经度
	private Long imgSize;    //文件大小
	private String imgName;  //文件名称
	public Long getImgSize() {
		return imgSize;
	}
	public void setImgSize(Long imgSize) {
		this.imgSize = imgSize;
	}
	public String getImgName() {
		return imgName;
	}
	public void setImgName(String imgName) {
		this.imgName = imgName;
	}
	public String getImgHeight() {
		return imgHeight;
	}
	public void setImgHeight(String imgHeight) {
		this.imgHeight = imgHeight;
	}
	public String getImgWidth() {
		return imgWidth;
	}
	public void setImgWidth(String imgWidth) {
		this.imgWidth = imgWidth;
	}
	public String getDateTime() {
		return dateTime;
	}
	public void setDateTime(String dateTime) {
		this.dateTime = dateTime;
	}
	public String getAltitude() {
		return altitude;
	}
	public void setAltitude(String altitude) {
		this.altitude = altitude;
	}
	public String getLatitude() {
		return latitude;
	}
	public void setLatitude(String latitude) {
		this.latitude = latitude;
	}
	public String getLongitude() {
		return longitude;
	}
	public void setLongitude(String longitude) {
		this.longitude = longitude;
	}
	
	public String toString (){
		return "[图片信息]文件名称:"+ this.imgName+"   文件大小:"+this.imgSize +"  高度:"+this.imgHeight+"  宽度:"+this.imgWidth+"  拍摄时间:"+this.dateTime+"  海拔:"+this.altitude+"   纬度:"+this.latitude+"  经度:"+this.longitude;
	}
}

通过以上代码就能得到图片中的exif信息。



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值