libexif

关注
义项:EXIF元数据库
libexif

libexif是采用纯可移植C语言编写的自由软件函数库,用于从图像文件中读取、编辑和保存EXIF(Exchangeable Image File Format)元数据[1]。EXIF是数码相机在拍摄时写入JPEG等图像文件的隐形信息段,内容涵盖快门速度、光圈、GPS定位乃至相机机主姓名等[1]。该库以GNU宽通用公共许可证第2.1版(LGPL)授权,可运行于GNU/Linux、各类BSD、macOS与Windows等遵循POSIX规范的系统[1]。它把大量命令行工具和图形程序中重复的EXIF处理代码统一为通用实现,因此成为众多照片管理与图像处理软件的基础组件[2]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

libexif是一个面向EXIF元数据的C语言函数库,提供解析、编辑与保存图像文件中EXIF数据的接口[2]。它的目标是把大量命令行工具和图形界面程序中各自重复实现的EXIF处理逻辑,收敛成一套可复用的通用代码[3]。库以纯C写成,不依赖其他额外库;若系统中存在GNU gettext,则会用于界面文字的翻译[2]。

libexif本身只是一套库,不能直接显示信息。项目同时提供几个配套软件包:命令行工具exif用于显示JPEG文件中的EXIF信息,libexif-gtk提供基于GTK+的图形界面控件,gexif是调用libexif-gtk的图形前端,libexif-testsuite则用于对libexif和exif做回归测试[1]。

原理

EXIF数据在文件内部按IFD(Image File Directory,图像文件目录)分区组织,常见的字段分布在IFD0、EXIF子IFD和GPS子IFD等不同目录中,同一类数值还可能出现在不同分区[4]。因此访问某个标签时,必须同时给出标签枚举值和它所在的分区,而不能只靠字段名字符串检索[4]。

按照libexif的API设计,调用者一般先创建一个ExifLoader,把EXIF数据读入内存;随后从加载器取出ExifData,作为操作数据的入口。每个IFD对应ExifData中的一个ExifContent,其中以ExifEntry的形式存放该目录内的所有标签数据;若需要制造商注释(MakerNote),则从ExifData中提取ExifMnoteData再作处理[5]。库内部以C语言模拟面向对象的风格,为每种数据结构定义一组操作函数[5]。

标签中的数值多为原始字节,需经exif_entry_get_value等函数转换后才能得到可读字符串,字节序与字符编码由函数内部处理[4]。GPS经纬度属于有理数类型,底层由分子与分母两个无符号32位整数构成,库会将其格式化为类似“39.9042, 116.4074”的文本[4]。

发展历程

libexif由Lutz Müller发起,其代码的版权记录可以追溯到2001年。项目早期在SourceForge上托管,2002年期间版本从0.5.x系列快速迭代,先后发布了0.5.4、0.5.6、0.5.8、0.5.9等版本,其间加入了IFD分区结构、Windows平台适配以及多种语言的翻译[6]。2002年至2003年间,Marcus Meissner、Semyon Sosin、Javier Achirica等人也参与了代码贡献。

此前的libmnote库在开发过程中被合并进libexif,不再作为独立组件存在[2]。2010年之后维护工作由Dan Fandrich等人承担,项目的源码托管逐渐由SourceForge转向代码托管平台,官方网站的地址也随之变更[7]。

版本迭代在2020年代持续进行。2020年5月发布的0.6.22修复了多处MakerNote处理中的缓冲区越界读取问题[8];2021年8月发布0.6.23,2021年12月发布0.6.24[9];2025年发布的0.6.25,以及2026年4月14日发布的0.6.26,均以修复整数溢出、整数下溢等安全缺陷为主要内容[10]。0.6.26还增加了对JPEG APP3标记的处理,并新增EXIF_TAG_IMAGE_DEPTH标签[10]。

应用

libexif最直接的用途是在程序中读取数码照片的拍摄参数。相机写入的EXIF段包含快门速度、光圈、感光度等摄影参数,也包含GPS位置和机主名称等信息,库的作用就是让计算机程序能够访问这些数据[1]。由于EXIF数据既可读也可写,程序还能修改已有标签或添加新标签,再把结果写回图像文件[11]。

在实际软件中,libexif被多种照片管理与设备访问工具采用。命令行工具gphoto2及其图形前端gtkam借助它处理数码相机照片的元数据,KDE平台的数字照片管理程序digikam也将其作为组成部分[2]。提供GTK+控件的libexif-gtk以及受其启发的PHP库pel同样属于这一生态[3]。

在操作系统与发行版层面,libexif作为基础依赖被广泛打包。它出现在NetBSD的软件包集合中[12],也是Fedora、Debian、Ubuntu、Alpine等发行版的常规组件,其中Fedora 41所打包的版本为0.6.24,Alpine 3.23提供的版本为0.6.26[13][14]。移动平台方面,Android系统的源码树中同样包含该库的副本[15]。

局限

libexif的格式覆盖面有限。它只处理JPEG(含JFIF与Exif结构)中的EXIF段,对PNG、WebP、HEIC等格式无效,也不解析XMP或IPTC元数据,只识别JPEG的APP1段内的标准EXIF结构[4]。在标签支持上,库覆盖EXIF标准2.1中的全部标签以及2.2标准中的大部分标签[2]。

制造商注释是另一个薄弱环节。这类由厂商自行定义的数据格式缺乏统一标准,libexif只能处理其中一部分,而且处理效果并不理想,官方文档也承认这方面仍有较多工作待完成[3]。库所支持的制造商注释来自佳能、卡西欧、爱普生、富士、尼康、奥林巴斯、宾得和三洋等品牌[2]。

由于需要解析外部文件中的长度、偏移与组件数等字段,libexif长期面临内存安全方面的缺陷。历史上出现过的类型包括整数溢出与整数下溢、缓冲区越界读取、除零错误以及递归深度失控等,多集中在MakerNote解码路径上[16]。2026年披露的CVE-2026-32775、CVE-2026-40385与CVE-2026-40386即分别涉及MakerNote处理中的整数下溢、32位系统上尼康注释的无符号整数溢出,以及富士和奥林巴斯注释解码时的整数下溢,后果可能包括程序崩溃或信息泄露[17]。相关缺陷在0.6.26版本中得到修复[10]。

参见

  • EXIF —— libexif所处理的目标数据格式,定义数码相机写入图像文件的元数据结构。

  • JPEG —— libexif通过解析其中的APP1段获取EXIF数据的主要图像格式。

  • gphoto2 —— 使用libexif处理数码相机照片元数据的命令行工具。

  • GTK+ —— libexif-gtk与gexif构建图形界面的基础工具包。

  • C语言 —— libexif的实现语言,库本身以纯可移植C编写。

  • 元数据 —— EXIF数据所属的信息类别,用于描述图像本身的属性。

参考资料

  1. The libexif C EXIF library [引用日期2026-10-14]
  2. README [引用日期2026-10-14]
  3. README [引用日期2026-10-14]
  4. C++如何获取图片的EXIF信息 [引用日期2026-10-14]
  5. EXIF library (libexif) API: The libexif library [引用日期2026-10-14]
  6. 2002-12-11 Lutz Mueller <lutz@users [引用日期2026-10-14]
  7. Format: https://www [引用日期2026-10-14]
  8. CVE-2020-13112 | Ubuntu [引用日期2026-10-14]
  9. Index of /libexif [引用日期2026-10-14]
  10. Releases · libexif/libexif - Skip to content [引用日期2026-10-14]
  11. 深入解析libexif库在图像EXIF信息提取中的应用_如何提取图片EXIF信息 [引用日期2026-10-14]
  12. graphics/libexif - The NetBSD Packages Collection [引用日期2026-10-14]
  13. libexif-0.6.24-8.fc41.src | RPM Info [引用日期2026-10-14]
  14. libexif-0.6.26-r0.apk [引用日期2026-10-14]
  15. README [引用日期2026-10-14]
  16. Package: libexif / 0.6.21-2+deb9u4 [引用日期2026-10-14]
  17. ELA-1737-1 libexif security update [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T18:27:20Z

历史版本

本条目引用的词条
EXIF JPEG gphoto2 GTK+ C语言 元数据