这里简单介绍一下如何通过开源C++工具包Exiv2读取图片中的属性信息

其实做这项工作之前也想偷懒百度一下的,大都是Java写的安卓的 ExifInterface 类,这和我的工作扯不上一点关系啊,最后终于谷歌出了Exiv2开源C++库

一、简介

        ExifExchangeable image file format)即可交换图像文件格式,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。

Exif最初由日本电子工业发展协会在1996年制定,版本为1.0。1998年,升级到2.1,增加了对音频文件的支持。2002年3月,发表了2.2版。

Exif可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。

Windows 7操作系统具备对Exif的原生支持,通过鼠标右键点击图片打开菜单,点击属性并切换到详细信息标签下即可直接查看Exif信息。

Exif信息是可以被任意编辑的,因此只有参考的功能。

下表列出几项Exif会提供的消息,只是部分

项目 信息(举例)
制造厂商 Canon
相机型号 Canon EOS-1Ds Mark III
图象方向 正常(upper-left)
图象分辨率X 300
图象分辨率Y 300
分辨率单位 dpi
Software Adobe Photoshop CS Macintosh
最后异动时间 2005:10:06 12:53:19
YCbCrPositioning 2
曝光时间 0.00800 (1/125) sec
光圈值 F22
拍摄模式 光圈优先
ISO感光值 100
Exif信息版本 30,32,32,31
图象拍摄时间 2005:09:25 15:00:18
图象存入时间 2005:09:25 15:00:18
曝光补偿(EV+-) 0
测光模式 点测光(Spot)
闪光灯 关闭
镜头实体焦长 12 mm
Flashpix版本 30,31,30,30
图象色域空间 sRGB
图象尺寸X 5616 pixel
图象尺寸Y 3744 pixel

二、Exif信息解析(摘自http://blog.csdn.net/fioletfly/article/details/53605959)

实例分析:PICT0021.JPG

00   FF D8 FF E1 3A 59 45 78 69 66 00 00 4D 4D 00 2A 
10   00 00 00 08 00 0C 01 0E 00 02 00 00 00 0E 00 00
20   03 F4 01 0F 00 02 00 00 00 20 00 00 04 02 01 10
30   00 02 00 00 00 20 00 00 04 22 01 12 00 03 00 00
40   00 01 00 01 00 00 01 1A 00 05 00 00 00 01 00 00
50   04 42 01 1B 00 05 00 00 00 01 00 00 04 4A 01 28
60   00 03 00 00 00 01 00 02 00 00 01 31 00 02 00 00 
70   00 20 00 00 04 52 01 32 00 02 00 00 00 14 00 00
80   04 72 02 13 00 03 00 00 00 01 00 01 00 00 87 69
90   00 04 00 00 00 01 00 00 00 9E 88 25 00 04 00 00
A0   00 01 00 00 02 A2 00 00 02 E4 00 28 82 9A 00 05
B0   00 00 00 01 00 00 04 86 82 9D 00 05 00 00 00 01
C0   00 00 04 8E 88 22 00 03 00 00 00 01 00 02 00 00
D0   88 27 00 03 00 00 00 01 00 C8 00 00 90 00 00 07
E0   00 00 00 04 30 32 32 31 90 03 00 02 00 00 00 14
F0   00 00 04 96 90 04 00 02 00 00 00 14 00 00 04 AA
100  91 01 00 07 00 00 00 04 01 02 03 00 91 02 00 05
110  00 00 00 01 00 00 04 BE 92 01 00 0A 00 00 00 01
120  00 00 04 C6 92 02 00 05 00 00 00 01 00 00 04 CE
130  92 04 00 0A 00 00 00 01 00 00 04 D6 92 05 00 05
140  00 00 00 01 00 00 04 DE 92 06 00 05 00 00 00 01
150  00 00 04 E6 92 07 00 03 00 00 00 01 00 02 00 00
160  92 08 00 03 00 00 00 01 00 00 00 00 92 09 00 03
170  00 00 00 01 00 20 00 00 92 0A 00 05 00 00 00 01
180  00 00 04 EE 92 7C 00 07 00 00 00 40 00 00 04 F6
190  A0 00 00 07 00 00 00 04 30 31 30 30 A0 01 00 03
1A0  00 00 00 01 00 01 00 00 A0 02 00 04 00 00 00 01
1B0  00 00 12 00 A0 03 00 04 00 00 00 01 00 00 0D 80
1C0  A0 05 00 04 00 00 00 01 00 00 02 84 A2 15 00 05
1D0  00 00 00 01 00 00 05 36 A2 17 00 03 00 00 00 01
1E0  00 02 00 00 A3 00 00 07 00 00 00 01 03 00 00 00
1F0  A3 01 00 07 00 00 00 01 01 00 00 00 A4 01 00 03
200  00 00 00 01 00 00 00 00 A4 02 00 03 00 00 00 01
210  00 00 00 00 A4 03 00 03 00 00 00 01 00 00 00 00
220  A4 04 00 05 00 00 00 01 00 00 05 3E A4 05 00 03
230  00 00 00 01 00 29 00 00 A4 06 00 03 00 00 00 01
240  00 00 00 00 A4 07 00 03 00 00 00 01 00 00 00 00
250  A4 08 00 03 00 00 00 01 00 00 00 00 A4 09 00 03
260  00 00 00 01 00 00 00 00 A4 0A 00 03 00 00 00 01
270  00 00 00 00 A4 0B 00 07 00 00 00 04 00 00 00 00
280  A4 0C 00 03 00 00 00 01 00 00 00 00 00 00 00 00
290  00 02 00 01 00 02 00 00 00 04 52 39 38 00 00 02
2A0  00 07 00 00 00 04 30 31 30 30 00 00 00 00 00 05
2B0  00 00 00 01 00 00 00 04 02 02 00 00 00 01 00 02
2C0  00 00 00 02 4E 00 00 00 00 02 00 05 00 00 00 03
2D0  00 00 05 46 00 03 00 02 00 00 00 02 45 00 00 00
2E0  00 04 00 05 00 00 00 03 00 00 05 5E 00 00 00 00
2F0  00 06 01 03 00 03 00 00 00 01 00 06 00 00 01 1A
300  00 05 00 00 00 01 00 00 05 76 01 1B 00 05 00 00
310  00 01 00 00 05 7E 01 28 00 03 00 00 00 01 00 02
320  00 00 02 01 00 04 00 00 00 01 00 00 07 F4 02 02
330  00 04 00 00 00 01 00 00 32 5D 00 00 00 00 00 00
   
   FF D8       SOI
   FF E1       APP1
   3A 59       APP1 LENGTH
   45 78 69 66 00 00 Exif ASCII结束符两个
   4D 4D       MM big endian TIFF Header (注意小端的为:49492A00 08000000)
   00 2A       fixed
   00 00 00 08 IFD0 offset
   00 0C       IFD0: number of TAGs 12个tag,每个12字节。
   01 0E       TAG      Image title   
   00 02       TYPE ASCII
   00 00 00 0E count   最多13个字符
   00 00 03 F4 offset +0C=0x400 可以看到DCIM\100MEDIA (0x0c from the start of the TIFF header 4D4D MM)

01 0F       TAG Image input equipment manuf 
   00 02       TYPE ASCII
   00 00 00 20 count   最多31个字符
   00 00 04 02 offset +0c=0x040E 可以看到TCL

01 10       TAG Image input equipment model 
   00 02       TYPE ASCII
   00 00 00 20 count
   00 00 04 22 offset +0c=0x042E 可以看到SDV05
   
   01 12       TAG Orientation of image 
   00 03       SHORT             00 01
   00 00 00 01 count
   00 01 00 00 value 
   
   01 1A       TAG Image resolution in width 0x0442+0c=0x44E,可以看到00 00 00 48/00 00 00 01
   00 05       RATIONAL 
   00 00 00 01 count
   00 00 04 42 offset +0c=0x44E,可以看到00 00 00 48/00 00 00 01
   
   01 1B       TAG Image resolution in height 
   00 05       RATIONAL
   00 00 00 01 
   00 00 04 4A offset+0c=0x456 可以看到00 00 00 48/00 00 00 01
   
   01 28       Unit of X and Y resolution
   00 03       SHORT                00 02
   00 00 00 01 
   00 02 00 00 
   
   01 31       Software used 
   00 02       ASCII
   00 00 00 20 count
   00 00 04 52 offset +0c =0x45E 可以看到0.0.2
   
   01 32       DateTime 
   00 02       ASCII
   00 00 00 14 20字节
   00 00 04 72 offset+0c=0x47E,可以看到2012:07:29 21:28:18
   
   02 13       YCbCrPositioning
   00 03       SHORT      00 01
   00 00 00 01 
   00 01 00 00
   
   87 69       Exif IFD Pointer
   00 04       LONG
   00 00 00 01 count
   00 00 00 9E offset+0c=0xAA
   
   88 25       GPS Info IFD Pointer
   00 04       LONG
   00 00 00 01 count
   00 00 02 A2 offset+0c=0x02AE
   
   00 00 02 E4 nextIFD IFD1 offset
   
   00 28  Exif IFD number of TAGs
   82 9A  ExposureTime
   00 05  RATIONAL
   00 00 00 01 count
   00 00 04 86 offset+0c=0x0492
   ...

Exif的相关信息这里先不做分析,请大家参照上面的文档自己分析了。

这里主要是分析GPS相关信息

GPS Info IFD Pointer 0x02AE  从上面数据2A0行的后面看数据
   00 05       count of TAGs
   
   00 00       GPSVersionID
   00 01       BYTE
   00 00 00 04 count
   02 02 00 00 value 2.2.0.0
   
   00 01       GPSLatitudeRef
   00 02       ASCII
   00 00 00 02 count
   4E 00 00 00 N North  
   
   00 02       GPSLatitude
   00 05       RATIONAL                 前4字节为分子,后4字节为分母,十六进制先转为十进制
   00 00 00 03 count
   00 00 05 46 offset+0c=0x552   16 00 00 00 01 00 00 00 22 00 00 00 01 00 00 00 51 00 00 00 04 00 00 00
                                                       22/1=22                             34/1=34                              81/4= 20.25
                                                      通过windows的右键属性看详细信息:22;34;20.249999999999915
   00 03       GPSLongitudeRef
   00 02
   00 00 00 02 count
   45 00 00 00 East
   
   00 04       GPSLongitude
   00 05       RATIONAL
   00 00 00 03 count
   00 00 05 5E offset+0c=0x56A     71 00 00 00 01 00 00 00 37 00 00 00 01 00 00 00 6C 00 00 00 04 00
                                                       113/1=113                          55/1=55                             108/4=27
                                                    通过windows的右键属性看详细信息:113;55;27.000000000000171

550 04 00 16 00 00 00 01 00 00 00 22 00 00 00 01 00 
560 00 00 51 00 00 00 04 00 00 00 71 00 00 00 01 00
570 00 00 37 00 00 00 01 00 00 00 6C 00 00 00 04 00
580 00 00 00 00 00 48 00 00 00 01 00 00 00 48 00 00
590 00 01 00 00 00 00 00 00

上面的分析知识帮助理解Exif文件在图片中的存储协议,加深印象,这个在我的实际操作中并未使用(因为我也不晓得作者是怎么把图片解码成这样的)

三、应用Exiv2工具包(下载地址)

刚开始我实在Windows7+VS2013环境下使用的,但是在添加路径读取图片的时候始终不能成功,现在想来应该是动态链接库等各种配置没有搞定,后来就老老实实的切到了ubuntu+Qt下,修改了一下examples,终于成功了(也算能给老师交差了)

在ubuntu下,文件包的结构是这样的
dist/linux/bin/exiv2                                   exiv2 and sample applications
dist/linux/lib/libexiv2.so.26.0.0                   shared library
dist/linux/include/exiv2/                             include files
dist/linux/share/                                          man pages
dist/samples/                                           sample code
dist/logs/                                               log files
dist/contrib/Qt                                         Qt code and notes

要运行exiv2库,在终端下执行

$ cd dist
$ export LD_LIBRARY_PATH="$PWD/linux/lib:$LD_LIBRARY_PATH"
$ linux/bin/exiv2To compile and link your own code:
$ cd dist
$ sudo cp -R linux/* /usr/local/
$ g++ -std=c++98 samples/exifprint.cpp -L/usr/local/lib -lexiv2 -o exifprint
$ ./exifprint --version
exiv2=0.26.0
...
xmlns=xmpidq:http://ns.adobe.com/xmp/Identifier/qual/1.0/
$

显示如上就算是完成安装完成了,然后新建一个控制台工程,把刚才的共享库等包含在工程的配置文件中,参考examples或者下载的解压包中的samples文件夹中的例程,修修改改,基本上就满足我的需求了

在Exiv2库中,可以读写的属性信息参考此链接

效果图,以GPS信息为例,这是windows7下右键属性读到的信息

这是利用Exiv2读到的

filepath--想要读取的图片的路径

exifDataName--此链接中的Key值

代码方法1

std::string getValueOfTag1(std::string filepath, std::string &exifDataName)
{Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(filepath);if(image.get() == 0)cout<<"failed to opened..."<<endl;image->readMetadata();Exiv2::ExifData &exifData = image->exifData();if (exifData.empty()) {std::cout<<"empty......"<<endl;}Exiv2::Exifdatum& Modle_tag = exifData[exifDataName];std::string valueOfTag = Modle_tag.toString();std::cout<<exifDataName<<" is "<<valueOfTag<<std::endl;return valueOfTag;
}

方法2

std::string getValueOfTag2(std::string filepath, std::string &exifDataName)
{Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(filepath);if(image.get() == 0)cout<<"failed to opened..."<<endl;image->readMetadata();Exiv2::ExifData &exifData = image->exifData();if (exifData.empty()) {std::cout<<"empty......"<<endl;}Exiv2::ExifKey key(exifDataName);Exiv2::ExifData::const_iterator i = exifData.findKey(key);std::cout << "key is "<< i->key() <<std::endl;//the name of key
//    std::cout << "Tag(hex) is "<< "0x" << std::hex << i->tag() << std::endl;
//    std::cout << "Type is "<< i->typeName() << std::endl;
//    std::cout << "Tag(dec) is "<< std::dec << i->count() <<std::endl;
//    std::cout << "Value of tag is "<< std::dec << i->value()<<std::endl;std::cout << "Value of tag is "<< i->value()<<std::endl;string valueOfTag = "yeah!";return valueOfTag;
}

使用时只需要在main中直接调用这其中一个函数即可,注意图片的路径!

四、小结

该库可供读写的选项十分丰富,但是也存在不足(也可能时个人原因)。比如在获取信息的GPS数据的精度问题上,只能够保留四个小数位,误差太大,误差还是很大的,略有不足,但是镜头焦距上,有更高的准确度。如果朋友们能够读取更高精度的GPS信息,请告知一下,谢谢~

                                                           博客有帮助的话亲扫一扫支付宝红包二维码呀~

通过Exiv2读取照片的Exif信息获取GPS,焦距等信息相关推荐

  1. PHP如何读取照片的exif信息

    什么是Exif? Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的.实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈.快门.白平衡.ISO.焦距.日期时 ...

  2. 【避坑指“难”】微信小程序自定义相机:自定义取景框、本地保存照片可分享、获取GPS定位

    CustomCamera 功能介绍 与 展示 小程序取景框内拍照 实时显示当前时间 显示当前经纬度 显示当前街道信息 可本地保存照片 代码实现 1.拍照功能 拍摄照片:CameraContext.ta ...

  3. iOS 应用信息、手机设备信息、网络信息、权限信息、GPS、网络信息、存储信息、屏幕信息、传感器信息、手机卡信息等信息获取工具

    JSAnalysis 本文只做介绍,项目源码在github,链接如下 JSAnalysis项目github链接 项目简介 JSAnalysis 是一款苹果设备信息静默获取的工具.它可以在用户无感知的情 ...

  4. C# 读取照片的EXIF信息

    一.使用 MetadataExtractor 读取 EXIF 信息 1.NuGet 中安装 在 NuGet 中搜索并安装 MetadataExtractor: 2.包信息 我安装后会有两个包:Meta ...

  5. activit6.0 根据当前节点信息获取下一步的审批人信息

    背景:公司内部oa系统进行审批,需要集成极光推送,这样的话,需要在审批的时候,通过当前节点,查找出下一个需要审批人的信息,在网上查看了很多资料,大多都是activit版本对不上,还有就是提供的代码不完 ...

  6. H5App Web端定位当前位置,获取GPS和地址信息 (高德API)

    仅支持高级浏览器 首先注册高德地图开发者账号,建立应用,获取key 页面中引入: <script type="text/javascript" src="http: ...

  7. php 获取警告信息,获取PHP警告错误信息的解决方法_PHP教程

    代码如下所示: 复制代码 代码如下: "; fileWrite($filename, $result, 'w'); } function sendBankMsg($msg) { $times ...

  8. 服务器提取用户信息,获取客户端和服务器信息

    运行效果: 前台设计界面: 前台代码: 无标题页 服务器端环境 服务器名称: 服务器的IIS: 服务器的IP地址: 服务器的域名: 服务器的操作系统: 服务器的端口: 服务器的路径: 域名主机: 服务 ...

  9. Himall商城插件内部成员\获取已安装的插件信息\获取指定的插件信息

    #region 内部成员 /// <summary>         /// 已安装插件         /// </summary>         static Dicti ...

最新文章

  1. 图像和视频的快速去雾算法研究
  2. 201503-4 网络延时 (本质是求树的最长路径)
  3. 从C语言的角度重构数据结构系列(六)-C语言的数据类型及常变量
  4. python中long类型_浅谈python 四种数值类型(int,long,float,complex)
  5. mysql中怎么存住文件链接_数据库如何保存链接文件
  6. 安装rational rose软件详细教程(不用注册账号)
  7. 【Scratch】进阶篇-《Scratch游戏开发》恐龙跳一跳
  8. ideaIU-2019.3.2.exe安装教程
  9. 从产品驱动看专注和结果导向的关系
  10. Google提供Fastboot和ADB单独下载服务(转载)
  11. python自然语言处理 分词_Python 自然语言处理(基于jieba分词和NLTK)
  12. Router中如何设置光标以全屏十字架显示
  13. 【HTML】iframe标签
  14. QQ邮箱不显示图片解决方案
  15. avc水平什么意思_西方经济学中AVC是什么意识?
  16. windows系统开机自动进行NTP时间同步和系统时间修正
  17. 【PaperReading】使用limma、Glimma和edgeR对RNA-seq数据分析
  18. Java8函数式编程——Stream流
  19. Vue + ant design 实现嵌套子表格
  20. 西蒙菲莎大学 计算机科学,西蒙菲莎大学世界排名2021年

热门文章

  1. 【转载】基于ENVI bandmath的地表温度反演
  2. Linux 驱动开发 四十三:platform 设备驱动实验(一)
  3. 诺基亚7.2 刷原厂固件
  4. 利用matlab数米粒数量,数米粒个数和每个米粒面积的matlab算法实现(递归)。
  5. 展开w ndows文件很慢,(Wndows优化大师的功能和使用方法分析.doc
  6. 【竞品分析】小睡眠APP和蜗牛睡眠APP,基于用户体验5要素的分析框架
  7. 在Label mx标签制作软件中普通打印机也可以打标签
  8. s3550(config-if)#switchport mode access 的解释
  9. 学会这几个PPT制作技巧,让同事对你刮目相看
  10. 利用arpspoof探取账户密码