Java获取照片EXIF信息

本文介绍使用Java语言读取图像的EXIF信息的方法,包括相机型号、拍摄时间和方向等元数据。通过示例代码展示了如何利用DrewNoakes的metadata-extractor库解析JPG图片的EXIF数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          EXIF是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上EXIF格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。 

         EXIF是Exchangeable Image File的缩写,这是一种专门为数码相机照片设定的格式。这种格式可以用来记录数字照片的属性信息,例如相机的品牌及型号、相片的拍摄时间、拍摄时所设置的光圈大小、快门速度、ISO等等信息。除此之外它还能够记录拍摄数据,以及照片格式化方式,这样就可以输出到兼容EXIF格式的外设上,例如照片打印机等。

         目前最常见的支持EXIF信息的图片格式是JPG,很多的图像工具都可以直接显示图片的EXIF信息,包括现在的一些著名的相册网站也提供页面用于显示照片的EXIF信息。本文主要介绍Java语言如何读取图像的EXIF信息,包括如何根据EXIF信息对图像进行调整以适合用户浏览。需要注意的是,并不是每个JPG图像文件都包含有EXIF信息

         目前最简单易用的EXIF信息处理的Java包是Drew Noakes写的metadata-extractor,该项目最新的版本是2.3.0,支持EXIF 2.2版本。你可以直接从http://www.drewnoakes.com/code/exif/ 下载该项目的最新版本包括其源码。

下面这个示例是把图片的所有的EXIF信息全部打印出来:

  1. import java.io.File;  
  2. import java.util.Iterator;  
  3.    
  4. import com.drew.imaging.jpeg.JpegMetadataReader;  
  5. import com.drew.metadata.Directory;  
  6. import com.drew.metadata.Metadata;  
  7. import com.drew.metadata.Tag;  
  8. import com.drew.metadata.exif.ExifDirectory;  
  9.    
  10. /** 
  11.  * 测试用于读取图片的EXIF信息 
  12.  * @author Winter Lau 
  13.  */  
  14. public class ExifTester {  
  15.      public static void main(String[] args) throws Exception {  
  16.          File jpegFile = new File(“D:\\我的文档\\我的相册\\DSCF1749.JPG”);  
  17.          Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);  
  18.          Directory exif = metadata.getDirectory(ExifDirectory.class);  
  19.          Iterator tags = exif.getTagIterator();  
  20.          while (tags.hasNext()) {  
  21.              Tag tag = (Tag)tags.next();  
  22.              System.out.println(tag);  
  23.          }  
  24.      }  
  25. }  
import java.io.File;
import java.util.Iterator;

import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import com.drew.metadata.exif.ExifDirectory;

/**
 * 测试用于读取图片的EXIF信息
 * @author Winter Lau
 */
public class ExifTester {
     public static void main(String[] args) throws Exception {
         File jpegFile = new File("D:\\我的文档\\我的相册\\DSCF1749.JPG");
         Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);
         Directory exif = metadata.getDirectory(ExifDirectory.class);
         Iterator tags = exif.getTagIterator();
         while (tags.hasNext()) {
             Tag tag = (Tag)tags.next();
             System.out.println(tag);
         }
     }
}


下面这个示例是读取相机的型号:

  1. Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);  
  2. Directory exif = metadata.getDirectory(ExifDirectory.class);  
  3. String model = exif.getString(ExifDirectory.TAG_MODEL);  
Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);
Directory exif = metadata.getDirectory(ExifDirectory.class);
String model = exif.getString(ExifDirectory.TAG_MODEL);

下面这个示例是读取图片方向:

  1. Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);  
  2. Directory exif = metadata.getDirectory(ExifDirectory.class);  
  3. String direction = exif.getString(ExifDirectory.TAG_ORIENTATION);  
Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);
Directory exif = metadata.getDirectory(ExifDirectory.class);
String direction = exif.getString(ExifDirectory.TAG_ORIENTATION);


获得了方向还要知道方向对应的图片显示方向,我们在拍照的时候经常会根据场景的不同来选择相机的方向,例如拍摄一颗高树,我们会把相机竖着拍摄,使景物刚好适合整个取景框,但是这样得到的图片如果用普通的图片浏览器看便是倒着的,需要调整角度才能得到一个正常的图像,

  1. public String getOrientationDescription() throws MetadataException{  
  2.     if (!_directory.containsTag(ExifDirectory.TAG_ORIENTATION)) return null;  
  3.     int orientation = _directory.getInt(ExifDirectory.TAG_ORIENTATION);  
  4.     switch (orientation) {  
  5.     case 1return “Top, left side (Horizontal / normal)”;  
  6.     case 2return “Top, right side (Mirror horizontal)”;  
  7.     case 3return “Bottom, right side (Rotate 180)”;  
  8.     case 4return “Bottom, left side (Mirror vertical)”;  
  9.     case 5return “Left side, top (Mirror horizontal and rotate 270 CW)”;  
  10.     case 6return “Right side, top (Rotate 90 CW)”;  
  11.     case 7return “Right side, bottom (Mirror horizontal and rotate 90 CW)”;  
  12.     case 8return “Left side, bottom (Rotate 270 CW)”;  
  13.     defaultreturn String.valueOf(orientation);  
  14. }  
public String getOrientationDescription() throws MetadataException{
    if (!_directory.containsTag(ExifDirectory.TAG_ORIENTATION)) return null;
    int orientation = _directory.getInt(ExifDirectory.TAG_ORIENTATION);
    switch (orientation) {
    case 1: return "Top, left side (Horizontal / normal)";
    case 2: return "Top, right side (Mirror horizontal)";
    case 3: return "Bottom, right side (Rotate 180)";
    case 4: return "Bottom, left side (Mirror vertical)";
    case 5: return "Left side, top (Mirror horizontal and rotate 270 CW)";
    case 6: return "Right side, top (Rotate 90 CW)";
    case 7: return "Right side, bottom (Mirror horizontal and rotate 90 CW)";
    case 8: return "Left side, bottom (Rotate 270 CW)";
    default: return String.valueOf(orientation);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值