由于项目需要对照片的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. Solium代码测试框架

    Solium, 在solid中,Linter用于标识和修复样式&安全问题 //调用测试 solium -d contracts --fix 源代码名称:Solium 源代码网址:http:// ...

  2. HDU 2494/POJ 3930 Elevator(模拟)(2008 Asia Regional Beijing)

    Description Too worrying about the house price bubble, poor Mike sold his house and rent an apartmen ...

  3. Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  4. http和https的异同

    转自:http://blog.csdn.net/whatday/article/details/38147103 什么是 HTTPS? HTTPS (基于安全套接字层的超文本传输协议 或者是 HTTP ...

  5. lintcode-187-加油站

    187-加油站 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油gas[i],并且从第_i_个加油站前往第_i_+1个加油站需要消耗汽油cost[i]. 你有一辆油箱容量无限大的汽车,现在要从 ...

  6. 修改IntelliJ IDEA字体

  7. 织梦dede:list标签在列表页同一文章显示两次的解决方法

    在列表页用{dede:list}标签调用文章的时候出现了同一篇文章显示两次的问题,经过一天的奋战最后终于解决了,下面CMS集中营站长简单说下我的解决过程来供各位学友参考:1.怀疑是不是每次添加都会自动 ...

  8. 微信小程序 功能函数 计时器

    let lovetime = setInterval(function () { let str = '(' + n + ')' + '重新获取' that.setData({ getText2: s ...

  9. 内存交换空间(swap)的构建

    一.使用物理分区构建swap 1.先进行分区的行为. [root@iZ255cppmtxZ ~]# fdisk /dev/xvdb Welcome to fdisk (util-linux ). Ch ...

  10. SQL查询数据总结

    SQL查询数据 完整语法 Select [select选项] 字段列表[字段别名]/* from 数据源 [where条件子句] [group by子句] [having子句] [order by子句 ...