由于项目需要对照片的EXIF信息进行处理,因此在网上搜索了一番。捣鼓出来了,写下,总结。

需要用到2个jar包,metadata-extractor-2.3.1和mediautil-1.0。这2个jar包比较好找,地址就不写了,搜索下就OK。需要注意的是,mediautil-1.0这个jar包你需要修改下。因为,项目需要修改GPS,其提供的例子后面还提供了个地址,里面有5个java文件,拿出来,在项目中建好。然后在jar包将里面5个同名的文件删除,就OK了。否则你的例子会报错,还有,项目的JDK必须是1.5,编译环境也必须是1.5哦。这2个jar包,前者只能读,不能写,后者呢可以读也可以写,但是使用没有前者方便,因此仍然保留。

下面就帖2段代码,只贴main方法了。

先是读取EXIF信息的。

<span style="font-size:14px;">public static void main(String[] args) throws Exception {
File jpegFile = new File("D://nozip//4.jpg");
Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);
Directory exif = metadata.getDirectory(ExifDirectory.class);//这里要稍微注意下
Iterator tags = exif.getTagIterator();
while (tags.hasNext()) {
Tag tag = (Tag)tags.next();
System.out.println(tag);
}
} </span>

上面写的稍微注意的地方是要注意ExifDirectory.class,因为ExifDirectory只是EXIF中大部分的参数,但是并不是所有的参数。比如要查看GPS的信息则需要GpsDirectory,而它和ExifDirectory都是继承自Directory。同样继承自Directory还有好几个,就看你需要的情况了。顺便贴下它的API

再下面是写EXIF信息的。

<span style="font-size:14px;">       /**
* 将照片中的信息进行重写
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception { //原文件
InputStream fip = new BufferedInputStream(new FileInputStream("D://nozip//2.jpg")); // No need to buffer
LLJTran llj = new LLJTran(fip);
try {
llj.read(LLJTran.READ_INFO, true);
} catch (LLJTranException e) {
e.printStackTrace();
} Exif exif = (Exif) llj.getImageInfo(); /* Set some values directly to gps IFD */ Entry e; // Set Latitude
e = new Entry(Exif.ASCII);
e.setValue(0, 'N');
exif.setTagValue(Exif.GPSLatitudeRef,-1, e, true); //设置具体的精度
e = new Entry(Exif.RATIONAL);
e.setValue(0, new Rational(31, 1));
e.setValue(1, new Rational(21, 1));
e.setValue(2, new Rational(323, 1));
exif.setTagValue(Exif.GPSLatitude,-1, e, true); // Set Longitude
e = new Entry(Exif.ASCII);
e.setValue(0, 'E');
exif.setTagValue(Exif.GPSLongitudeRef,-1, e, true); //设置具体的纬度
e = new Entry(Exif.RATIONAL);
e.setValue(0, new Rational(120, 1));
e.setValue(1, new Rational(58, 1));
e.setValue(2, new Rational(531, 1));
exif.setTagValue(Exif.GPSLongitude,-1, e, true); llj.refreshAppx(); // Recreate Marker Data for changes done //改写后的文件,文件必须存在
OutputStream out = new BufferedOutputStream(new FileOutputStream("D://nozip//1.jpg")); // Transfer remaining of image to output with new header.
llj.xferInfo(null, out, LLJTran.REPLACE, LLJTran.REPLACE); fip.close();
out.close(); llj.freeMemory();
} </span>

将图片中的GPS信息进行重写后,再用上面读GPS的来读将读取不到任何信息,只能在ExifDirectoy里面才能读到了,但是都是unkown tag了,很是奇怪。但是,机器等设备还是可以读到信息的。

from: http://www.aiuxian.com/article/p-2976272.html

照片EXIF信息的读取和改写的JAVA实现的更多相关文章

  1. PHP获取照片exif信息

    在这个没图说个屁的年代,照片还是很重要的.如果照片上传后会自动加上 照片相关信息,那用户体验的确会好很多,本着这个想法,今天尝试了下 PHP获取照片exif信息,重要的是 获取图片的GPS信息,如果再 ...

  2. GOEXIF读取和写入EXIF信息

    最新版本的gexif,直接基于gdi+实现了exif信息的读取和写入,代码更清晰. /* * File: gexif.h * Purpose: cpp EXIF reader * 3/2/2017 & ...

  3. 用C#读取相片(JPG图片)的EXIF信息的方法

    引言:EXIF,是英文Exchangeable Image File{}#endregion#region 数据转换结构/// summary>/// 转换数据结构/// /summary> ...

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

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

  5. 使用Java程序读取JPG Tif等格式图片的exif信息

    package com.util; import java.io.File;import java.util.Iterator; import com.drew.imaging.ImageProces ...

  6. Java读取图片exif信息实现图片方向自动纠正

    起因 一个对试卷进行OCR识别需求,需要实现一个功能,一个章节下的题目图片需要上下拼接合成一张大图,起初写了一个工具实现图片的合并,程序一直很稳定的运行着,有一反馈合成的图片方向不对,起初怀疑是本身图 ...

  7. java读取图片的(尺寸、拍摄日期、标记)等EXIF信息

    1.metadata-extractor是 处理图片EXIF信息的开源项目,最新代码及下载地址:https://github.com/drewnoakes/metadata-extractor 2.本 ...

  8. IOS: 使用imageIO获取和修改图片的exif信息

    使用imageIO获取和修改图片的exif信息 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸, ...

  9. 图片Exif信息

    Exif文件格式简述链接:https://www.zhihu.com/question/23727439/answer/25467748 可交换图像文件常被简称为Exif(Exchangeable i ...

随机推荐

  1. 使用深度学习来破解 captcha 验证码(转)

    使用深度学习来破解 captcha 验证码 本项目会通过 Keras 搭建一个深度卷积神经网络来识别 captcha 验证码,建议使用显卡来运行该项目. 下面的可视化代码都是在 jupyter not ...

  2. [leetcode-748-Largest Number At Least Twice of Others]

    In a given integer array nums, there is always exactly one largest element. Find whether the largest ...

  3. 【数位DP】题集

    1.[HDOJ2089] 题意:求区间内不出现4和62的数的个数 解法:模板题 2.[HDOJ3555] 题意:求区间内不出现49的数的个数 解法:模板题 3.[HDOJ5179] 题意:对于一个十进 ...

  4. JavaBean中DAO设计模式简介

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Ser ...

  5. lintcode-196-寻找缺失的数

    196-寻找缺失的数 给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数. 样例 N = 4 且序列为 [0, 1, 3] 时,缺失的数为2. 挑战 在数组上 ...

  6. hadoop下安装mysql

    http://www.cnblogs.com/zhuyp1015/p/3561470.html       第一步:先把这个文件放入到linux环境下桌面. 接着编写脚本:sudo apt-get u ...

  7. C#中的unsafe

    为了保持类型安全性,默认情况下,C# 不支持指针算法. 但是,通过使用 unsafe 关键字,可以定义可在其中使用指针的不安全上下文. 有关指针的详细信息,请参阅主题指针类型. 备注 在公共语言运行时 ...

  8. oracle 时间段内的所有行时间

    获取一段时间内所有的小时 SELECT to_date('2013-07-01 12', 'yyyy-mm-dd hh24') + (ROWNUM - 1) / 24 sdate FROM dualC ...

  9. 在select中,载入时默认select为空白,选项内不显示空白项

    有两种办法,一种纯css实现,一种借助js实现. html: <body onload="load()"> <select id="abc" ...

  10. springBoot按条件装配:Condition

    编码格式转换器接口 package com.boot.condition.bootconditionconfig.converter; /** * 编码格式转换器接口 */ public interf ...