由于项⽬需要对照⽚的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 >public static void main(String[] args) throws Exception {
File jpegFile = new File("D://nozip//4.jpg");
Metadata metadata = adMetadata(jpegFile);
Directory exif = Directory(ExifDirectory.class);//这⾥要稍微注意下
Iterator tags = TagIterator();
while (tags.hasNext()) {
Tag tag = (();
System.out.println(tag);
}
}
</span>
上⾯写的稍微注意的地⽅是要注意ExifDirectory.class,因为ExifDirectory只是EXIF中⼤部分的参数,但是并不是所有的参数。⽐如要查看GPS的信息则需要GpsDirectory,⽽它和ExifDirectory都是继承⾃Directory。同样继承⾃Directory还有好⼏个,就看你需要的情况了。顺便贴下它的API。
再下⾯是写EXIF信息的。
<span > /**
* 将照⽚中的信息进⾏重写
* @param args
* @throws Exception
exif信息*/
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 {
} catch (LLJTranException e) {
e.printStackTrace();
}
Exif exif = (Exif) ImageInfo();
/* 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);
//改写后的⽂件,⽂件必须存在
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了,很是奇怪。但是,机器等设备还是可以读到信息的。
发布评论