Java实现获取图片和视频文件的Exif信息

目录
  • 前言
  • 一、相关知识简介
    • 1、Metadata 元数据
    • 2、Exif 可交换图像文件信息
    • 3、metadata-extractor 库
  • 二、使用步骤
    • 1、创建Maven项目
    • 2、Metadata信息获取
    • 3、根据不同的Directory精确Tag提取
    • 4、经纬度提取
    • 5、视频元数据提取
  • 三、对Exif的中文解释
  • 四、总结

前言

随着现在实景地图的如火如荼建设,无人机等航拍测绘手段的不断升级,我们在获取全景照片或者正射影像,全景视频等数据上更加快速、便捷。由于无人机本身不进行相关数据的处理,比如全景地图的生成、视频的信息解析等。以全景照片为例,无人机作业时一般会在拍摄时自动记录GPS信息,拍照的坐标信息。通过自动获取图片的经纬度信息,可以快速对照片进行定位。而我们在旅游时,通常都会进行拍照,通过开启自动记录位置后,随时可以帮助我们生成旅游地图。而这些基本信息的获取,就离不开对文件元数据(metadata)的读取。

因此,本文将重点介绍如何使用Java编程语言结合metadata-extractor去自动获取全景图片的Exif信息,获取照片的拍摄坐标信息。

一、相关知识简介

1、Metadata 元数据

元数据(Matedata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息。用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。元数据是关于据的组织、数据域及其关系的信息。

图片元数据(Metadata) 是嵌入到图片文件中的一些标签。比较像文件属性,但是种类繁多。对于数码图像,目前常见的研数据有EXIF, IPTC和XMP三种。

EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号、镜头、曝光、图片尺寸等信息

IPTF:比如图片标题、关键字、说明、作者、版权等信息。主要由人工在后期通过软件写入。

XMP:XMP实际上是一种元数据存储和管理的标准,可以将Exif,IPTC或其他的数据都按XMP统一的格式存放在图像文件中。

2、Exif 可交换图像文件信息

可交换图像文件(Exchangeable Image File,Exif)信息图像在拍摄时保留的相关参数:比如图像信息(厂商,分辨率等),相机拍摄记录(ISO,白平衡,饱和度,锐度等),缩略图(缩略图宽度,高度等),GPS(拍摄时的经度,纬度,高度)等,按照图像文件标准存储在图像头文件。一般使用支持图像读取的软件即可查看部分参数,但是图像如果修改,Exif信息可能丢失。

上图是一张带了坐标的JPG照片信息,在Windows中通过查看文件的详细信息,可以看到这张图片的Exif信息。

3、metadata-extractor 库

metadata-extractor 库是一个用于提取图片和视频的Exif信息的组件库。它主要提供的功能有:

更多的信息可以查看metadata-extractor相关介绍

二、使用步骤

1、创建Maven项目

在Pom.xml中引入metadata-extractor

<!-- https://mvnrepository.com/artifact/com.drewnoakes/metadata-extractor -->
<dependency>
    <groupId>com.drewnoakes</groupId>
    <artifactId>metadata-extractor</artifactId>
    <version>2.18.0</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

2、Metadata信息获取

这里使用ImageMetadataReader统一获取元数据信息,针对Jpg、Png、Gif等还有针对性的类,JpegMetadataReader、PngMetadataReader、GifMetadataReader等。

Metadata metadata = ImageMetadataReader.readMetadata(file);
for (Directory directory : metadata.getDirectories()) {
     for (Tag tag : directory.getTags()) {
         String tagName = tag.getTagName();  //标签名
         String desc = tag.getDescription(); //标签信息
         System.out.println(tagName + "===" + desc);//照片信息
      }
}

通过代码,正常输出可以看到以下的信息:

Compression Type===Baseline
Data Precision===8 bits
Image Height===4096 pixels
Image Width===8192 pixels
Number of Components===3
Component 1===Y component: Quantization table 0, Sampling factors 2 horiz/2 vert
Component 2===Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert
Component 3===Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert
Image Width===8192 pixels
Image Height===4096 pixels
Bits Per Sample===8 8 8 bits/component/pixel
Image Description===default
Make===Hasselblad
Model===L1D-20c
Orientation===Top, left side (Horizontal / normal)
Samples Per Pixel===3 samples/pixel
X Resolution===72 dots per inch
Y Resolution===72 dots per inch
Resolution Unit===Inch
Software===10.00.12.07
Date/Time===2021:03:21 14:13:31
YCbCr Positioning===Center of pixel array
Windows XP Comment===0.9.142
Windows XP Keywords===pano
Exposure Time===1/200 sec
F-Number===f/5.0
Exposure Program===Program normal
ISO Speed Ratings===100
Exif Version===2.30
Date/Time Original===2021:03:21 14:13:31
Date/Time Digitized===2021:03:21 14:13:31
Components Configuration===YCbCr
Exposure Bias Value===0.3 EV
Max Aperture Value===f/2.8
Metering Mode===Average
White Balance===Daylight
Flash===Flash did not fire
Focal Length===10.3 mm
Makernote===[19829 values]
FlashPix Version===1.00
Color Space===sRGB
Exif Image Width===8192 pixels
Exif Image Height===4096 pixels
File Source===Digital Still Camera (DSC)
Scene Type===Directly photographed image
Exposure Mode===Auto exposure
White Balance Mode===Auto white balance
Digital Zoom Ratio===1
Scene Capture Type===Standard
Gain Control===None
Contrast===None
Saturation===None
Sharpness===None
Device Setting Description===0 0 0 0
Body Serial Number===0K8TGB40121511
Lens Specification===28mm f/2.8-11.0
Interoperability Index===Recommended Exif Interoperability Rules (ExifR98)
Interoperability Version===1.00
GPS Version ID===2.300
GPS Latitude Ref===N
GPS Latitude===28° 14' 37.6"
GPS Longitude Ref===E
GPS Longitude===112° 53' 24.86"
GPS Altitude Ref===Sea level
GPS Altitude===126 metres
Image Width===192 pixels
Image Height===90 pixels
Compression===JPEG
X Resolution===72 dots per inch
Y Resolution===72 dots per inch
Resolution Unit===Inch
Thumbnail Offset===21114 bytes
Thumbnail Length===18699 bytes
XMP Value Count===30
Number of Tables===4 Huffman tables
Detected File Type Name===JPEG
Detected File Type Long Name===Joint Photographic Experts Group
Detected MIME Type===image/jpeg
Expected File Name Extension===jpg
File Name===1.jpg
File Size===14057645 bytes
File Modified Date===星期二 三月 23 20:14:37 +08:00 2021

3、根据不同的Directory精确Tag提取

示例代码如下:

File jpegFile = new File(pathname);
Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);
boolean type = metadata.containsDirectoryOfType(GpsDirectory.class);
System.out.println(type);
System.out.println(metadata.getDirectoryCount());
Iterable<Directory> it = metadata.getDirectories();
for(Directory d : it) {
    System.out.println(d);
    Collection<Tag> tags = d.getTags();
    for(Tag tag :tags) {
        System.out.println(tag.getTagName()+"==="+ tag.getDescription());
    }
}

Image Width===849
Image Height===504
Bits Per Sample===8
Color Type===True Color
Compression Type===Deflate
Filter Method===Adaptive
Interlace Method===No Interlace
Detected File Type Name===PNG
Detected File Type Long Name===Portable Network Graphics
Detected MIME Type===image/png
Expected File Name Extension===png
File Name===111.png
File Size===61265 bytes
File Modified Date===星期日 十月 02 19:48:34 +08:00 2022

4、经纬度提取

通过GpsDirectory来获取GeoLocation获取经坐标信息

System.out.println("开始读取gps信息...");
Collection<GpsDirectory> gpsDirectories = metadata.getDirectoriesOfType(GpsDirectory.class);
for(GpsDirectory gps : gpsDirectories) {
    //获取图片的经纬度信息
    GeoLocation geoLocation = gps.getGeoLocation();
    System.out.println(geoLocation.getLongitude());
    System.out.println(geoLocation.getLatitude());
    System.out.println("********************************************************");
}

开始读取gps信息...
112.89023869444445
28.243777055555558
********************************************************
GPS Version ID===2.300
GPS Latitude Ref===N
GPS Latitude===28° 14' 37.6"
GPS Longitude Ref===E
GPS Longitude===112° 53' 24.86"
GPS Altitude Ref===Sea level
GPS Altitude===126 metres

将图片的点在地图上定位信息如上图所示

5、视频元数据提取

System.out.println("视频信息提取");
File file = new File("E:/静园历史影像.mp4");
Metadata metadata = Mp4MetadataReader.readMetadata(file);
for (Directory directory : metadata.getDirectories()) {
     for (Tag tag : directory.getTags()) {
     String tagName = tag.getTagName();  //标签名
     String desc = tag.getDescription(); //标签信息
     System.out.println(tagName + "===" + desc);//照片信息
     }
}

视频信息提取
Major Brand===MP4  Base Media v1 [IS0 14496-12:2003]
Minor Version===512
Compatible Brands===[MP4  Base Media v1 [IS0 14496-12:2003], MP4 Base Media v2 [ISO 14496-12:2005], MP4 Base w/ AVC ext [ISO 14496-12:2005], MP4 v1 [ISO 14496-1:ch13]]
Creation Time===Fri Jan 01 08:00:00 CST 1904
Modification Time===Fri Jan 01 08:00:00 CST 1904
Duration===52608
Media Time Scale===1000
Duration in Seconds===00:00:53
Transformation Matrix===65536 0 0 0 65536 0 0 0 1073741824
Preferred Rate===1
Preferred Volume===1
Next Track ID===3
Rotation===0
Creation Time===星期五 一月 01 08:00:00 +08:00 1904
Modification Time===星期五 一月 01 08:00:00 +08:00 1904
ISO 639-2 Language Code===und
Opcolor===0 0 0
Graphics Mode===Copy
Compression Type===H.264
Width===1366 pixels
Height===768 pixels
Depth===24-bit color
Horizontal Resolution===72
Vertical Resolution===72
Frame Rate===9.905
Creation Time===星期五 一月 01 08:00:00 +08:00 1904
Modification Time===星期五 一月 01 08:00:00 +08:00 1904
ISO 639-2 Language Code===und
Balance===0
Format===MPEG-4, Advanced Audio Coding (AAC)
Number of Channels===2
Sample Size===16
Sample Rate===48000
File Name===静园历史影像.mp4
File Size===16800279 bytes
File Modified Date===星期六 七月 16 23:16:24 +08:00 2022

三、对Exif的中文解释

四、总结

以上就是今天要讲的内容,本文简单介绍了Metadata 元数据以及Exif 可交换图像文件信息的基本知识,介绍了 metadata-extractor的具体用法,展示了png图像元数据读取、GPS坐标识别和定位以及视频的元数据信息提取,而metadata-extractor提供了大量能使我们快速便捷地获取元数据的方法。

到此这篇关于Java实现获取图片和视频文件的Exif信息的文章就介绍到这了,更多相关Java获取图片视频Exif信息内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 提取照片的EXIF信息批量重命名

    手机或照机拍摄的照片名称通常是"IMG_001.JPG"这种格式,这种文件名称是无意义的.使用照片拍摄时间命名可以让我们在多年以后查找照片时根据文件名就能快速筛选出某一时间段的照片. 原始照片或视频是带有EXIF信息的.这些信息是设备在拍摄时生成,记录了照片的拍摄时间,设备信息,拍摄GPS位置等信息,在文件属性中可以查看到: 图片APP和网盘软件中图片时间线也是提取EXIF信息生成的.如果对照片进行处理,如美化操作,另存为时可能会丢失EXIF信息,或者EXIF信息被改写,会导致识别信息

  • Java读取图片EXIF信息的方法

    本文实例讲述了Java读取图片EXIF信息的方法.分享给大家供大家参考.具体分析如下: 首先介绍一下什么是EXIF,EXIF是Exchangeable Image File的缩写,这是一种专门为数码相机照片设定的格式.这种格式可以用来记录数字照片的属性信息,例如相机的品牌及型号.相片的拍摄时间.拍摄时所设置 的光圈大小.快门速度.ISO等等信息.除此之外它还能够记录拍摄数据,以及照片格式化方式,这样就可以输出到兼容EXIF格式的外设上,例如照片打印机 等. 目前最常见的支持EXIF信息的图片格式

  • Java实现获取图片和视频文件的Exif信息

    目录 前言 一.相关知识简介 1.Metadata 元数据 2.Exif 可交换图像文件信息 3.metadata-extractor 库 二.使用步骤 1.创建Maven项目 2.Metadata信息获取 3.根据不同的Directory精确Tag提取 4.经纬度提取 5.视频元数据提取 三.对Exif的中文解释 四.总结 前言 随着现在实景地图的如火如荼建设,无人机等航拍测绘手段的不断升级,我们在获取全景照片或者正射影像,全景视频等数据上更加快速.便捷.由于无人机本身不进行相关数据的处理,比

  • Android编程获取图片和视频缩略图的方法

    本文实例讲述了Android编程获取图片和视频缩略图的方法.分享给大家供大家参考,具体如下: 从Android 2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位 置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取. 1. createVideoThumbnail static Bitmap createVideoThumbnail(

  • Java 合并多个MP4视频文件

    局限性 只支持MP4文件 经过尝试对于一些MP4文件分割不了 依赖 <!-- mp4文件操作jar --> <!-- https://mvnrepository.com/artifact/com.googlecode.mp4parser/isoparser --> <dependency> <groupId>com.googlecode.mp4parser</groupId> <artifactId>isoparser</art

  • Golang获取目录下的文件及目录信息操作

    一.获取当前目录下的文件或目录信息(不包含多级子目录) func main() { pwd,_ := os.Getwd() //获取文件或目录相关信息 fileInfoList,err := ioutil.ReadDir(pwd) if err != nil { log.Fatal(err) } fmt.Println(len(fileInfoList)) for i := range fileInfoList { fmt.Println(fileInfoList[i].Name()) //打印

  • PhotoShop给图片自动添加边框及EXIF信息的JS脚本

    作为一名"摄影爱好者"(好吧我承认我不太合格,我才玩摄影没几天-_-!!)总有一件事情避免不了,就是让照片带上EXIF的参数,虽然本人的部落格已经安装了插件可以显示出EXIF信息,但是感觉插件还是不太给力,此外还要考虑到一些综合的操作,比如批量的调整大小,增加版权信息等等. 当然,好在我们还要PS,我们还可以写PS的脚本让他来按照我们的想法来进行某些操作:)嘿嘿,从无忌论坛的一个帖子找到了一个PS脚本,按照自己的想法略加了一些修改(主要是时间,镜头识别,以及焦距识别)效果图见题图.有了

  • Powershell获取图片名字、文件夹及拍摄时间的例子

    如果你想要整理你的图片档案,这里有一段代码它能从图片文件获取相关的拍摄信息. 这个例子使用一个系统函数获得"我的图片"的路径,接着从其目录和子目录查询所有的文件.获得的结果通过管道符传递给函数Get-DateTaken,它将返回这些图片的名字.文件夹及照片的拍摄日期. 复制代码 代码如下: function Get-DateTaken{  param  (    [Parameter(ValueFromPipeline=$true, ValueFromPipelineByPropert

  • Android如何获取图片或视频略缩图

    根据指定的图像路径和大小来获取缩略图 此方法有两点好处: 1.使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图. 2. 缩略图对于原图像来讲没有拉伸,这里使用了2.2版本的新工具ThumbnailUtils,使 用这个工具生成的图像不会被拉伸. /** * @param imagePath * 图像的路径 * @param width * 指定输出图像的宽度 * @para

  • JAVA如何获取工程下的文件

    其实很简单主要是理解编译路径 ①class.getResource public static void main(String[] args) { WordTest wordTest = new WordTest(); wordTest.getFile(); System.out.println(WordTest.class.getResource("")); System.out.println(WordTest.class.getResource("/"));

  • Android编程实现获取多媒体库视频、音频、图片的方法

    本文实例讲述了Android编程实现获取多媒体库视频.音频.图片的方法.分享给大家供大家参考,具体如下: 从媒体库中查找音频.视频.图片文件的相关信息,并获取视频.图片.专辑图片的缩略图 和一些文件操作 package com.uwatch.swconnectservice.util; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNot

  • vue 录制视频并压缩视频文件的方法

    文件上传框<input type="file">,除了可以选择文件上传之外,还可以调用摄像头来拍摄照片或者视频并上传.capture属性可以判断前置or后置摄像头.在视频播放的过程中,用canvas定时截取一张图片,然后用gif.js生成一张GIF图,从而完成前端的视频压缩. 我这里使用的是Vue写的,以下是我的流程及代码: 一.下载gif.js相关文件,可以到这里下载,然后将这几个文件放在根目录的static/js里面. gif.js相关文件及存放路径 二.下载依赖包:

随机推荐