Jul 07 2006

Jpeg Metadata Read/Write

Category: 技术ssmax @ 14:27:32

读jpeg的exif的方法:

metadata-extractor

http://www.drewnoakes.com/code/exif/

这个是比较完整的读取包了,但是没有写的功能,所以另外找了一个 

 

读/写jpeg的metadata

mediautil是sourceforge的mediachest的java api 子项目

http://mediachest.sourceforge.net/mediautil/

不过文档不是太完整,研究了半天终于找到读写的方法了

InputStream fip = new FileInputStream(filename);
LLJTran llj = new LLJTran(fip);
llj.read(LLJTran.READ_INFO,true);
llj.setComment(“test jpeg comment”);

llj.setAppx(0,LLJTran.dummyExifHeader,0,LLJTran.dummyExifHeader.length,true);
Exif exif = (Exif) llj.getImageInfo();
Entry entry = new Entry(Exif.ASCII);
entry.setValue(0,”test exif user comment”);
exif.setTagValue(Exif.USERCOMMENT,-1,entry,true);

llj.refreshAppx();

fip = new BufferedInputStream(new FileInputStream(filename));
OutputStream out = new BufferedOutputStream(new FileOutputStream(destfile));
llj.xferInfo(fip, out, LLJTran.REPLACE, LLJTran.REPLACE);
fip.close();
out.close();
llj.freeMemory();

 

首先用 LLJTran.READ_INFO 模式把jpeg的header和exif信息读入,不需要整个文件的读取。

然后编辑jpeg commnet 和exif信息

最后调用 llj.xferInfo 把header和exif信息,图象信息写入到新文件中,其中LLJTran.REPLACE 是指替换掉原来文件中的信息,可以用LLJTran.RETAIN来保持不便,第一个指定是exif,第二个是jpeg comment。

 

读取刚才写的2个信息 

InputStream fip = new FileInputStream(destfile); // No need to buffer
LLJTran llj = new LLJTran(fip);
Log.debugLevel = Log.LEVEL_NONE;
llj.read(LLJTran.READ_HEADER,true);
System.out.println(llj.getComment());

System.out.println(((Exif)llj.getImageInfo()).getTagValue(Exif.USERCOMMENT,true));
基本就是这样,当然如果要通用的话还要加一些简单的判断。

另外AcdSee生成的exif 2.2格式用这个mediautil读取好像有点问题,不过mediautil生成的exif 2.2用AcdSee读取就一点问题都没有,可能是兼容问题吧,再研究研究规范。

花了一个下午,把exif 2.2的文档看了下,原来comment里面的格式没有规定,可以用unicode格式:

UNICODE(后面是UTF16-LE字符)

前面几个是utf8 字符,考~

做这个的主要目的是在自己生成的图片上面加一些固定格式的信息,等用户上传的时候可以知道这个图片的概况。。。。如果要我做OCR分析的话我可没有这个能力。。。