定义
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]。
参见
参考资料
- The libexif C EXIF library [引用日期2026-10-14]
- README [引用日期2026-10-14]
- README [引用日期2026-10-14]
- C++如何获取图片的EXIF信息 [引用日期2026-10-14]
- EXIF library (libexif) API: The libexif library [引用日期2026-10-14]
- 2002-12-11 Lutz Mueller <lutz@users [引用日期2026-10-14]
- Format: https://www [引用日期2026-10-14]
- CVE-2020-13112 | Ubuntu [引用日期2026-10-14]
- Index of /libexif [引用日期2026-10-14]
- Releases · libexif/libexif - Skip to content [引用日期2026-10-14]
- 深入解析libexif库在图像EXIF信息提取中的应用_如何提取图片EXIF信息 [引用日期2026-10-14]
- graphics/libexif - The NetBSD Packages Collection [引用日期2026-10-14]
- libexif-0.6.24-8.fc41.src | RPM Info [引用日期2026-10-14]
- libexif-0.6.26-r0.apk [引用日期2026-10-14]
- README [引用日期2026-10-14]
- Package: libexif / 0.6.21-2+deb9u4 [引用日期2026-10-14]
- ELA-1737-1 libexif security update [引用日期2026-10-14]