Java读取图像metadata信息

原创 2017年07月29日 15:33:13

最近在做一个项目的时候需要要用的解析图像的拍摄时间,这些信息用图像查看工具基本都可以看到,之前有研究过MP3的文件格式,通过一些Tag来标记文件的一些信息,受此启发,猜测图像应该也有类似的机制。所以网上搜索了一下图像文件的存储格式,然后就查到了Exif规范,相机在拍照后按照Exif的相关规范,可以将拍摄时间、GPS等信息写入文件,我们按照规范格式将相关信息独取出来就好了,我上传了一份《Exif2.2》的官方文档,有兴趣可以下载查看。
知道了存储的格式,开始动手写代码解析?如果我完全自己动手按照规范解析,还是挺麻烦的,而且我们不需要重复造轮子,网上已经有了相关的库可以实现该功能。

Imaging (previously called Sanselan)

之前写过一篇《Imaging (previously called Sanselan)读取图像信息》,简单的介绍了一下这个库以及用法,下面我们就烂看一下,如何读取metadata信息。

package test;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.sanselan.ImageReadException;
import org.apache.sanselan.Sanselan;
import org.apache.sanselan.common.IImageMetadata;
import org.apache.sanselan.formats.jpeg.JpegImageMetadata;
import org.apache.sanselan.formats.tiff.TiffImageMetadata;
import org.junit.Test;


public class ImageMetaDataTest
{
   @Test
   public void test() throws Exception
   {

      File imageFile = new File("C:\\Users\\admin\\Desktop\\mmexport1501076450193.jpg");
      sanselan(imageFile);
   }

   public void sanselan(File file) throws ImageReadException, IOException
   {
      IImageMetadata metadata = Sanselan.getMetadata(file);
      if (metadata == null)
      {
         return;
      }
      System.err.println("metadata items:");
      ArrayList items = metadata.getItems();
      for (Object item : items)
      {
         System.err.println(item);
      }
      System.err.println("GPS info:");
      if (metadata instanceof JpegImageMetadata)
      {
         JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;

         TiffImageMetadata exifMetadata = jpegMetadata.getExif();
         if (null != exifMetadata)
         {
            TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS();
            if (null != gpsInfo)
            {
               double longitude = gpsInfo.getLongitudeAsDegreesEast();
               double latitude = gpsInfo.getLatitudeAsDegreesNorth();

               System.err.println("GPS Description: " + gpsInfo);
               System.err.println("GPS Longitude (Degrees East): " + longitude);
               System.err.println("GPS Latitude (Degrees North): " + latitude);
            }
         }
      }
   }

}

在这段示例代码中,我们首先读取图像的MetaData信息和GPS数据,如果我们只需要读取拍摄时间的话,我们可以这样写:

public String getDateBySanselan(File file) throws ImageReadException, IOException
{
   IImageMetadata metadata = Sanselan.getMetadata(file);
   if (metadata instanceof JpegImageMetadata)
   {
      JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
      TiffField field = jpegMetadata.findEXIFValue(TiffConstants.EXIF_TAG_DATE_TIME_ORIGINAL);
      if (field != null)
      {
         return field.getValueDescription().replace("'", "");
      }
   }
   return null;
}

metadata-extractor

项目地址为:https://github.com/drewnoakes/metadata-extractor

package test;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import org.junit.Test;

import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;

public class ImageMetaDataTest
{
   @Test
   public void test() throws Exception
   {
      File imageFile = new File("C:\\Users\\admin\\Desktop\\mmexport1501076450193.jpg");
      metadataExtractor(imageFile);
   }

   public void metadataExtractor(File file) throws ImageProcessingException, IOException
   {
      Metadata metadata = ImageMetadataReader.readMetadata(file);
      for (Directory directory : metadata.getDirectories())
      {
         System.err.println(directory.getClass());
         for (Tag tag : directory.getTags())
         {
            System.err.println(tag);
         }
      }
   }
}

同样的,上面一段代码也是打印图像的metadata信息,我个人感觉使用该包比Sanselan要方便一些,我们想要获得拍摄时间,只需要这样写:

public Date getDateByMetadataExtractor(File file) throws ImageProcessingException, IOException
{
   Metadata metadata = ImageMetadataReader.readMetadata(file);
   ExifSubIFDDirectory directory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
   return directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);
}
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/jianggujin/article/details/76329732

java 元数据metadata

1、元数据概念 元数据是关于数据的数据。在编程语言上下文中,元数据是添加到程序元素如方法、字段、类和包上的额外信息。对数据进行说明描述的数据 2、元数据的作用     一般来说,元数据可以用于...
  • ruanniu
  • ruanniu
  • 2016-08-25 16:09:56
  • 2105

元数据(MetaData)的简单理解

元数据是用来描述数据的数据(Data that describes other data)。单单这样说,不太好理解,我来举个例子。 下面是契诃夫的小说《套中人》中的一段,描写一个叫做瓦莲卡的女子...
  • CociJava
  • CociJava
  • 2016-03-21 20:53:38
  • 2466

Java中DatabaseMetaData 元数据信息

DatabaseMetaData的用法 一   、得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userN...
  • qq_29663071
  • qq_29663071
  • 2016-05-05 18:02:15
  • 1285

Java ResultSetMetaData之getColumnName与getColumnLabel

最近在写一个功能的时候遇到一个问题,今天刚好有空,就把他记录下来。 问题是这样的,在做一个很普通的查询功能,结果却出现了问题。问题是查出来莫名少了一些列,就是说用代码查出来的数据和用数据库客户端查出...
  • u010323023
  • u010323023
  • 2016-09-14 16:02:19
  • 2602

java通过结果集getMetaData()方法创建结果集元数据

  • 2012年05月24日 21:59
  • 737B
  • 下载

Java 8: 从永久代(PermGen)到元空间(Metaspace)

永久代(PermGen)和元空间(Metaspace)的今世前缘:       原文链接:原文作者:Monica Beckwith  以下为本人翻译,仅用于交流学习,版权归原作者和InfoQ所...
  • zhushuai1221
  • zhushuai1221
  • 2016-08-04 21:08:59
  • 9070

用Java读取图片文件属性中的详细信息数据

用java代码读取图片文件中的详细信息,包括图片的拍摄设备,曝光,快门等信息...
  • VenDrin
  • VenDrin
  • 2017-03-15 20:08:15
  • 2563

Java获取照片EXIF信息

今天上传几张照片到人人相册,发现可以看到我相机的信息,当然很多图片软件都能看到,所以搜索了下Java如何操作,以后备用。 原文地址:http://yijianfengvip.blog.163....
  • ghsau
  • ghsau
  • 2013-01-06 12:52:40
  • 20557

照片EXIF信息的读取和改写的JAVA实现

由于项目需要对照片的EXIF信息进行处理,因此在网上搜索了一番。捣鼓出来了,写下,总结。 需要用到2个jar包,metadata-extractor-2.3.1和mediautil-1.0。这2个ja...
  • molashaonian
  • molashaonian
  • 2016-03-25 15:48:15
  • 3488

java——从含有metadata的gz文件中提取压缩包中文件的名字

private String getInnerFilenameFromGZipFile(String filePath){ try( GzipCompressorInputStream stream...
  • chary2060
  • chary2060
  • 2017-04-20 20:48:56
  • 409
收藏助手
不良信息举报
您举报文章:Java读取图像metadata信息
举报原因:
原因补充:

(最多只允许输入30个字)