轻松获取图片和视频文件的Exif信息-Java篇

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

前言

      随着现在实景地图的如火如荼建设,无人机等航拍测绘手段的不断升级,我们在获取全景照片或者正射影像,全景视频等数据上更加快速、便捷。由于无人机本身不进行相关数据的处理,比如全景地图的生成、视频的信息解析等。以全景照片为例,无人机作业时一般会在拍摄时自动记录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信息可能丢失。

1.png

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

3、metadata-extractor 库

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

2.png

3.png

更多的信息可以查看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等。

Metadatametadata=ImageMetadataReader.readMetadata(file);
for (Directorydirectory : metadata.getDirectories()) {
for (Tagtag : directory.getTags()) {
StringtagName=tag.getTagName();  //标签名Stringdesc=tag.getDescription(); //标签信息System.out.println(tagName+"==="+desc);//照片信息      }
}

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

CompressionType===BaselineDataPrecision===8bitsImageHeight===4096pixelsImageWidth===8192pixelsNumberofComponents===3Component1===Ycomponent: Quantizationtable0, Samplingfactors2horiz/2vertComponent2===Cbcomponent: Quantizationtable1, Samplingfactors1horiz/1vertComponent3===Crcomponent: Quantizationtable1, Samplingfactors1horiz/1vertImageWidth===8192pixelsImageHeight===4096pixelsBitsPerSample===888bits/component/pixelImageDescription===defaultMake===HasselbladModel===L1D-20cOrientation===Top, leftside (Horizontal/normal)
SamplesPerPixel===3samples/pixelXResolution===72dotsperinchYResolution===72dotsperinchResolutionUnit===InchSoftware===10.00.12.07Date/Time===2021:03:2114:13:31YCbCrPositioning===CenterofpixelarrayWindowsXPComment===0.9.142WindowsXPKeywords===panoExposureTime===1/200secF-Number===f/5.0ExposureProgram===ProgramnormalISOSpeedRatings===100ExifVersion===2.30Date/TimeOriginal===2021:03:2114:13:31Date/TimeDigitized===2021:03:2114:13:31ComponentsConfiguration===YCbCrExposureBiasValue===0.3EVMaxApertureValue===f/2.8MeteringMode===AverageWhiteBalance===DaylightFlash===FlashdidnotfireFocalLength===10.3mmMakernote===[19829values]
FlashPixVersion===1.00ColorSpace===sRGBExifImageWidth===8192pixelsExifImageHeight===4096pixelsFileSource===DigitalStillCamera (DSC)
SceneType===DirectlyphotographedimageExposureMode===AutoexposureWhiteBalanceMode===AutowhitebalanceDigitalZoomRatio===1SceneCaptureType===StandardGainControl===NoneContrast===NoneSaturation===NoneSharpness===NoneDeviceSettingDescription===0000BodySerialNumber===0K8TGB40121511LensSpecification===28mmf/2.8-11.0InteroperabilityIndex===RecommendedExifInteroperabilityRules (ExifR98)
InteroperabilityVersion===1.00GPSVersionID===2.300GPSLatitudeRef===NGPSLatitude===28°14' 37.6"GPSLongitudeRef===EGPSLongitude===112°53' 24.86"GPSAltitudeRef===SealevelGPSAltitude===126metresImageWidth===192pixelsImageHeight===90pixelsCompression===JPEGXResolution===72dotsperinchYResolution===72dotsperinchResolutionUnit===InchThumbnailOffset===21114bytesThumbnailLength===18699bytesXMPValueCount===30NumberofTables===4HuffmantablesDetectedFileTypeName===JPEGDetectedFileTypeLongName===JointPhotographicExpertsGroupDetectedMIMEType===image/jpegExpectedFileNameExtension===jpgFileName===1.jpgFileSize===14057645bytesFileModifiedDate===星期二三月2320:14:37+08:002021

3、根据不同的Directory精确Tag提取,示例代码如下:

FilejpegFile=newFile(pathname);
Metadatametadata=JpegMetadataReader.readMetadata(jpegFile);
booleantype=metadata.containsDirectoryOfType(GpsDirectory.class);
System.out.println(type);
System.out.println(metadata.getDirectoryCount());
Iterable<Directory>it=metadata.getDirectories();
for(Directoryd : it) {
System.out.println(d);
Collection<Tag>tags=d.getTags();
for(Tagtag :tags) {
System.out.println(tag.getTagName()+"==="+tag.getDescription());
    }   
}
ImageWidth===849ImageHeight===504BitsPerSample===8ColorType===TrueColorCompressionType===DeflateFilterMethod===AdaptiveInterlaceMethod===NoInterlaceDetectedFileTypeName===PNGDetectedFileTypeLongName===PortableNetworkGraphicsDetectedMIMEType===image/pngExpectedFileNameExtension===pngFileName===111.pngFileSize===61265bytesFileModifiedDate===星期日十月0219:48:34+08:002022

4、经纬度提取

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

System.out.println("开始读取gps信息...");
Collection<GpsDirectory>gpsDirectories=metadata.getDirectoriesOfType(GpsDirectory.class);
for(GpsDirectorygps : gpsDirectories) {
//获取图片的经纬度信息GeoLocationgeoLocation=gps.getGeoLocation();
System.out.println(geoLocation.getLongitude());
System.out.println(geoLocation.getLatitude());
System.out.println("********************************************************");
}
开始读取gps信息...
112.8902386944444528.243777055555558********************************************************GPSVersionID===2.300GPSLatitudeRef===NGPSLatitude===28°14' 37.6"GPSLongitudeRef===EGPSLongitude===112°53' 24.86"GPSAltitudeRef===SealevelGPSAltitude===126metres

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

5、视频元数据提取

System.out.println("视频信息提取");
Filefile=newFile("E:/静园历史影像.mp4");
Metadatametadata=Mp4MetadataReader.readMetadata(file);
for (Directorydirectory : metadata.getDirectories()) {
for (Tagtag : directory.getTags()) {
StringtagName=tag.getTagName();  //标签名Stringdesc=tag.getDescription(); //标签信息System.out.println(tagName+"==="+desc);//照片信息     }
}
视频信息提取MajorBrand===MP4BaseMediav1 [IS014496-12:2003]
MinorVersion===512CompatibleBrands===[MP4BaseMediav1 [IS014496-12:2003], MP4BaseMediav2 [ISO14496-12:2005], MP4Basew/AVCext [ISO14496-12:2005], MP4v1 [ISO14496-1:ch13]]
CreationTime===FriJan0108:00:00CST1904ModificationTime===FriJan0108:00:00CST1904Duration===52608MediaTimeScale===1000DurationinSeconds===00:00:53TransformationMatrix===65536000655360001073741824PreferredRate===1PreferredVolume===1NextTrackID===3Rotation===0CreationTime===星期五一月0108:00:00+08:001904ModificationTime===星期五一月0108:00:00+08:001904ISO639-2LanguageCode===undOpcolor===000GraphicsMode===CopyCompressionType===H.264Width===1366pixelsHeight===768pixelsDepth===24-bitcolorHorizontalResolution===72VerticalResolution===72FrameRate===9.905CreationTime===星期五一月0108:00:00+08:001904ModificationTime===星期五一月0108:00:00+08:001904ISO639-2LanguageCode===undBalance===0Format===MPEG-4, AdvancedAudioCoding (AAC)
NumberofChannels===2SampleSize===16SampleRate===48000FileName===静园历史影像.mp4FileSize===16800279bytesFileModifiedDate===星期六七月1623:16:24+08:002022

三、对Exif的中文解释

5.png

    以上是参考了网友的博文,原文地址:Java获取图像Exif信息

     官网对相关参数的定义见:metadata-extractor

四、总结

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

目录
相关文章
|
3月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
116 9
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
140 2
|
22天前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
7天前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
16 0
|
2月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
290 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
121 34
|
1月前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
44 0
|
3月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
57 8
|
3月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
83 3

热门文章

最新文章