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分析的话我可没有这个能力。。。

5 Responses to “Jpeg Metadata Read/Write”

  1. Nason says:

    請問可以教我怎麼用Metadata將EXIF讀出以及寫入到EIXF嗎
    如果能的話請幫我
    howadtsai@Yahoo.com.tw

  2. ssmax says:

    不好意思,好久没看过这方面的了,有空我再看看,呵呵

  3. Nason says:

    我不會將經緯度寫入GPS中不過你的檔案可以讀出EXIF
    並且創造一個新圖片了已經幫上忙了卸卸
    如果能的話請交我如何在EXIF中加入GPS 經緯度的值

  4. ssmax says:

    用mediautil可以写入EXIF,上面就有例子了
    至于GPS信息不是太清除,如果只是EXIF中的信息,你研究一下它的规范应该就可以写入了。
    我找了一下,文档如下:
    http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html

    These GPS tags are part of the EXIF standard, and are stored in a separate IFD within the EXIF information.

    关键是这句,估计你还要找下EXIF的文档看看。呵呵。

  5. ssmax says:

    我上面的例子里面
    entry.setValue(0,”test exif user comment”);
    exif.setTagValue(Exif.USERCOMMENT,-1,entry,true);

    这两句你要研究下,我都忘记是什么了,呵呵
    估计是你把GPS对应的tag设置好应该就可以了。

Leave a Reply