[Image] 读取数码照片中的EXIF信息

[Image] 读取数码照片中的EXIF信息

相信大家都有使用数码相机拍照的经历,一张数码照片可以包含的内容远远超过了我们当前观察到的景物,他可能包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。这些信息都是存放在一个叫做Exif的文件里,然后把Exif文件放置在我们熟知的 JPEG/TIFF 文件的头部,也就是说 EXIF 信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数。

我在网上找到一个开源的开发工具包 Metadata-Extractor,使用它可以像ACDSee等图像软件一样读取数码照片的Exif信息。

我写了一个小Demo程序演示通过使用metadata-extractor-2.2.2读取数码照片的Exif信息并从Exif中读取图像缩略图。
import  java.io. * ;
import  java.nio. * ;
import  java.nio.channels. * ;
import  java.util. * ;

import  com.drew.imaging.jpeg. * ;
import  com.drew.metadata. * ;
import  com.drew.metadata.exif. * ;


 
public   class  ExifExtractor  {
  
public ExifExtractor() {
  }


  
public static void main(String[] args) {
    
try {
      Metadata metadata 
= JpegMetadataReader.readMetadata(new File("o_P4140147.JPG.jpg"));

      Iterator directories 
= metadata.getDirectoryIterator();
      
while (directories.hasNext()) {
        Directory directory 
= (Directory) directories.next();

        Iterator tags 
= directory.getTagIterator();
        
while (tags.hasNext()) {
          Tag tag 
= (Tag) tags.next();

          
// modify Exif
//          if (tag.getTagName().equalsIgnoreCase("User Comment")) {
//                      Directory exifDirectory = metadata.getDirectory(ExifDirectory.class);
//                      exifDirectory.setString(tag.getTagType(), "LeonChen");
//          }

          
// read thumbnail
          if (tag.getTagName().equalsIgnoreCase("Thumbnail Data")) {
            Directory exifDirectory 
= metadata.getDirectory(ExifDirectory.class);

            
byte[] dataBuffer = exifDirectory.getByteArray(tag.getTagType());
            FileChannel channel 
= new RandomAccessFile(new File("thumbnail.jpg"),
                
"rw").getChannel();
            MappedByteBuffer fileBuffer 
= channel.map(FileChannel.MapMode.
                READ_WRITE, 
0, dataBuffer.length);
            fileBuffer.put(dataBuffer);
            fileBuffer.force();
            channel.close();
          }


          
// print exif
          System.out.println(tag);
        }

      }

    }

    
catch (FileNotFoundException ex) {
      ex.printStackTrace();
    }

    
catch (IOException ex) {
      ex.printStackTrace();
    }

    
catch (MetadataException ex) {
      ex.printStackTrace();
    }

    
catch (JpegProcessingException ex) {
      ex.printStackTrace();
    }

  }

}


我在上面的测试程序里注释了一段代码,他们可以在内存中修改Exif中某一节点的信息,但是我不知道怎样才能将修改后的Exif信息保存到文件,如果你知道方法,请给我留言。

测试图片下载地址:
http://www.blogjava.net/images/blogjava_net/leon/2174/o_P4140147.JPG

EXIF参考:
http://www.exif.org

你可能感兴趣的:([Image] 读取数码照片中的EXIF信息)