欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > exif格式及解析库easyexif使用介绍

exif格式及解析库easyexif使用介绍

2025/5/15 16:14:29 来源:https://blog.csdn.net/yueguang8/article/details/140488762  浏览:    关键词:exif格式及解析库easyexif使用介绍

1.  JPEG文件结构和EXIF数据的信息

            JPEG文件以字符串"0xFFD8"开头表示图像信息开始,以字符串"0xFFD9"结尾表示图像信息结束。

            在JPEG文件头中有一系列"0xFF??"格式的数据段,称为"标识",用来标记JPEG文件的信息段。

        0xFFE0-0xFFEF之间的标识符称为"应用标记",没有被常规JPEG文件利用。EXIF就是利用这些信息段记录拍摄信息,如快门速度、光圈值等,甚至包括全球定位信息。

        EXIF定义的数据结构(APP1)采用"Intel"的小端字节顺序方案,且包含JPEG格式的缩略图。

        EXIF数据以ASCII字符"Exif"和2个字节的0x00开始,后面就是EXIF的数据,使用TIFF格式来存储数据。

总的来说,JPEG文件头中有一些预定义的标识符,其中应用标记0xFFE0-0xFFEF没有被常规JPEG文件使用。EXIF正是利用这些应用标记来存储拍摄信息等数据,采用TIFF格式组织数据。应用软件可以读取这些EXIF数据并解析出相关信息

        EXIF 是数码相机拍摄照片时记录在照片文件中的元数据标准。它包含了照片的拍摄时间、相机型号、光圈、快门速度、ISO 感光度、白平衡等各种拍摄参数信息。这些信息对于后期处理和管理数码照片非常有用。

        EXIF 数据通常以二进制形式嵌入在照片文件的头部或尾部,常见的文件格式包括 JPEG、TIFF 和 RAW 格式。不同的相机品牌和型号可能会记录不同种类的EXIF 信息。

       以 JPEG 文件为例,EXIF 数据通常位于 JPEG 文件头的 APP1 块中。用户可以使用各种软件查看和编辑 EXIF 数据,如 Windows 系统自带的图片浏览器、Adobe Lightroom、Photoshop 等。

        EXIF 数据为照片管理和后期处理提供了丰富的元数据信息。摄影爱好者可以利用 EXIF 数据分类、排序、搜索照片,并根据拍摄参数优化后期编辑。总的来说, EXIF 格式为数码摄影带来了很大的便利。

2. EXIF 数据通常包含以下几类信息:

       2.1 基本信息:

                拍摄时间和日期

                相机型号、制造商

                镜头焦距

                曝光时间

                光圈值

                ISO 感光度

                白平衡设置

                闪光灯状态

2.2 位置信息:

        GPS 坐标

        拍摄位置

        拍摄方向

2.3 图像处理信息:

        色彩空间

        图像尺寸和分辨率

        图像方向(横/竖拍)

        数字变焦倍数

2.4 版权信息:

        摄影师姓名

        版权所有者

        版权声明

EXIF 数据可以通过各种软件查看和编辑。常见的操作包括:

        查看照片的拍摄参数和位置信息

        根据 EXIF 数据对照片进行分类和管理

        修改 EXIF 数据,如添加拍摄地点、修改日期时间等

        将 EXIF 数据嵌入到新拍摄的照片中

        总的来说,EXIF 格式为数码摄影带来了许多便利,为摄影爱好者提供了丰富的元数据信息。掌握 EXIF 数据的使用技巧,可以大大提高照片管理和后期编辑的效率。

3. 可以使用‘MagicEXIF 元数据编辑器‘’软件进行查看jpeg文件信息

4. easyexif库介绍

        通过easyExif库快速方便的读取exif信息。下载地址为:https://github.com/mayanklahiri/easyexif

easyexif C++ 版本的主要特点如下:

        轻量级和跨平台

                仅依赖标准 C++ 库,没有其他外部依赖

                可以在 Windows、macOS 和 Linux 等主流操作系统上使用

        简单易用的 API

                提供了 EXIFInfo 类来表示 EXIF 数据

                通过简单的成员函数获取各种 EXIF 信息

        支持多种文件格式

                支持 JPEG、TIFF 和 DNG 等常见图像文件格式

         灵活的 EXIF 数据读写

                可以从文件或二进制数据中读取 EXIF 信息

                支持修改 EXIF 数据并写回文件

示例demo:

#include <stdio.h>
#include "exif.h"int main(int argc, char *argv[]) {if (argc < 2) {printf("Usage: demo <JPEG file>\n");return -1;}// Read the JPEG file into a bufferFILE *fp = fopen(argv[1], "rb");if (!fp) {printf("Can't open file.\n");return -1;}fseek(fp, 0, SEEK_END);unsigned long fsize = ftell(fp); //获取文件长度rewind(fp);                     //将文件内部的位置指针重新指向一个流的开头unsigned char *buf = new unsigned char[fsize];if (fread(buf, 1, fsize, fp) != fsize) {printf("Can't read file.\n");delete[] buf;return -2;}fclose(fp);// Parse EXIFeasyexif::EXIFInfo result;int code = result.parseFrom(buf, fsize); //使用easyexif库解析exif信息delete[] buf;if (code) {printf("Error parsing EXIF: code %d\n", code);return -3;}// Dump EXIF informationprintf("Camera make          : %s\n", result.Make.c_str());printf("Camera model         : %s\n", result.Model.c_str());printf("Software             : %s\n", result.Software.c_str());printf("Bits per sample      : %d\n", result.BitsPerSample);printf("Image width          : %d\n", result.ImageWidth);printf("Image height         : %d\n", result.ImageHeight);printf("Image description    : %s\n", result.ImageDescription.c_str());printf("Image orientation    : %d\n", result.Orientation);printf("Image copyright      : %s\n", result.Copyright.c_str());printf("Image date/time      : %s\n", result.DateTime.c_str());printf("Original date/time   : %s\n", result.DateTimeOriginal.c_str());printf("Digitize date/time   : %s\n", result.DateTimeDigitized.c_str());printf("Subsecond time       : %s\n", result.SubSecTimeOriginal.c_str());printf("Exposure time        : 1/%d s\n",(unsigned)(1.0 / result.ExposureTime));printf("F-stop               : f/%.1f\n", result.FNumber);printf("Exposure program     : %d\n", result.ExposureProgram);printf("ISO speed            : %d\n", result.ISOSpeedRatings);printf("Subject distance     : %f m\n", result.SubjectDistance);printf("Exposure bias        : %f EV\n", result.ExposureBiasValue);printf("Flash used?          : %d\n", result.Flash);printf("Flash returned light : %d\n", result.FlashReturnedLight);printf("Flash mode           : %d\n", result.FlashMode);printf("Metering mode        : %d\n", result.MeteringMode);printf("Lens focal length    : %f mm\n", result.FocalLength);printf("35mm focal length    : %u mm\n", result.FocalLengthIn35mm);printf("GPS Latitude         : %f deg (%f deg, %f min, %f sec %c)\n",result.GeoLocation.Latitude, result.GeoLocation.LatComponents.degrees,result.GeoLocation.LatComponents.minutes,result.GeoLocation.LatComponents.seconds,result.GeoLocation.LatComponents.direction);printf("GPS Longitude        : %f deg (%f deg, %f min, %f sec %c)\n",result.GeoLocation.Longitude, result.GeoLocation.LonComponents.degrees,result.GeoLocation.LonComponents.minutes,result.GeoLocation.LonComponents.seconds,result.GeoLocation.LonComponents.direction);printf("GPS Altitude         : %f m\n", result.GeoLocation.Altitude);printf("GPS Precision (DOP)  : %f\n", result.GeoLocation.DOP);printf("Lens min focal length: %f mm\n", result.LensInfo.FocalLengthMin);printf("Lens max focal length: %f mm\n", result.LensInfo.FocalLengthMax);printf("Lens f-stop min      : f/%.1f\n", result.LensInfo.FStopMin);printf("Lens f-stop max      : f/%.1f\n", result.LensInfo.FStopMax);printf("Lens make            : %s\n", result.LensInfo.Make.c_str());printf("Lens model           : %s\n", result.LensInfo.Model.c_str());printf("Focal plane XRes     : %f\n", result.LensInfo.FocalPlaneXResolution);printf("Focal plane YRes     : %f\n", result.LensInfo.FocalPlaneYResolution);return 0;
}

 运行结果如下:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词