一个很好的开源类库metadata-extractor处理jpeg图片

由于工作关系最近一直在研究处理大图片的问题(大于2M),刚开始用BufferedImage类来读:

BufferedImage image = ImageIO.read(File file);这个在读取小图片的时候没有问题但是在遇到起过1M(具体大小跟据JVM可占用的最大内存-Xmx有关)的大图片时就会抛出,OutOfMemoryException错误.在网上找了很多资料大多都是提高JVM最大内存,但是这样一来产生了一个问题.如果遇到了10M,100M,或1G的图片呢,总不能无限到加到JVM内存吧.

其实我只是想读取jpeg图片的长宽等参数来判断,如果超过尺寸则不许用户上传图片,其实可以不用把整个图片都读取进来,而是只读jpeg的头信息里面就有我想要的内容,言归正传这个时候我在网上找到了metadata-extractor类库,这个正是用来读图片(现在只支持jpeg格式)的小东西.

1.在工程中导入metadata-extractor-2.3.1.jar(可以到http://www.drewnoakes.com/code/exif/下载jar包及源码,还有文档)

2.开始使用...

例子:

File source="C://h.jpg";

Metadata metadata = com.drew.imaging.jpeg.JpegMetadataReader.readMetadata(source);
  
  JpegDirectory jd = (JpegDirectory)metadata.getDirectory(JpegDirectory.class);
  System.out.println("------------" + jd.getImageHeight()); //图片的高
  System.out.println("------------" + jd.getImageWidth());  //图片的宽

由于只是读取图片的头信息,所以无论多大的图片都能读取,而且速度很快.

 

例子:读取图片已知的所有信息.

Metadata metadata = com.drew.imaging.jpeg.JpegMetadataReader.readMetadata(source);

Iterator directories = metadata.getDirectoryIterator();
  while (directories.hasNext()) {
      Directory directory = (Directory)directories.next();
      // iterate through tags and print to System.out
      Iterator tags = directory.getTagIterator();
      while (tags.hasNext()) {
          Tag tag = (Tag)tags.next();
          // use Tag.toString()
          System.out.println(tag.toString());
      }
  }

大家有时间研究一下源码吧.没多少内容我只是用了其中的一个功能.

其它相关资源http://www.srcsky.com/kaiyuan/category/81?index=1&lang=8&show=hot头一回写博客,如果写的不好多多指教.

你可能感兴趣的:(java,iterator,jvm,file,tags,image,文档)