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 buffer
  FILE *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 EXIF
  easyexif::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 information
  printf("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;
}

 运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/802829.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

隐藏需求缺失的4种解决技巧

在需求分析过程中&#xff0c;隐藏需求的缺失往往会造成项目范围扩张、成本增加&#xff0c;造成延期交付和风险增加等问题&#xff0c;直接影响客户满意度。而隐藏需求的挖掘和确认&#xff0c;有利于优化项目范围&#xff0c;提升产品质量&#xff0c;增强团队信心。 因此&am…

MySQL 数据库 day 7.16

ok了家人们今天继续记录一下数据库,看看今天学了什么。 一.事物概述 1.1 环境准备 -- 账户表 create table account( id int primary key auto_increment, name varchar(20), money double );insert into account values (null,张三,1000); insert into account values (n…

【iOS】——ARC源码探究

一、ARC介绍 ARC的全称Auto Reference Counting. 也就是自动引用计数。使用MRC时开发者不得不花大量的时间在内存管理上&#xff0c;并且容易出现内存泄漏或者release一个已被释放的对象&#xff0c;导致crash。后来&#xff0c;Apple引入了ARC。使用ARC&#xff0c;开发者不再…

英福康INFICON TWare 32 软件操作说明

英福康INFICON TWare 32 软件操作说明

CVE-2024-24549 Apache Tomcat - Denial of Service

https://lists.apache.org/thread/4c50rmomhbbsdgfjsgwlb51xdwfjdcvg Apache Tomcat输入验证错误漏洞&#xff0c;HTTP/2请求的输入验证不正确&#xff0c;会导致拒绝服务&#xff0c;可以借助该漏洞攻击服务器。 https://mvnrepository.com/artifact/org.apache.tomcat.embed/…

【细如狗】记录一次使用MySQL的Binlog进行数据回滚的完整流程

文章目录 1 事情起因2 解决思路3 利用binlog进行数据回滚3.1 确认是否启用Binlog日志3.2 确认是否有binlog文件3.3 找到误操作的时间范围3.4 登录MySQL服务器查找binlog文件3.4.1 查询binlog文件路径3.4.2 找到binlog文件3.4.3 确认误操作被存储在哪一份binlog文件中 3.5 查看二…

【PyTorch快速入门教程】02 Jupyter notebook安装及配置

文章目录 1 安装 Jupyter notebook2 安装 ipykernel3 更改 jupyter 默认配置3.1 生成配置文件3.2 关键配置信息 4 扩展插件推荐参考 1 安装 Jupyter notebook 一行命令搞定 python -m pip install jupyter 现在就可以打开Jupyter notebook来运行python啦。 jupyter notebook…

网页设计:HTML标签

一、格式 dreamwave <!DOCTYPE html> <html ><head><meta charset"utf-8"><title>中文测试。。。。</title></head><body>这里是测试body测试内容。。。</body> </html> <head> 网页相关设置 &…

通过vagrant与VirtualBox 创建虚拟机

1.下载vagrant与VirtualBox【windows版本案例】 1.1 vagrant 下载地址 【按需下载】 https://developer.hashicorp.com/vagrant/install?product_intentvagranthttps://developer.hashicorp.com/vagrant/install?product_intentvagrant 1.2 VirtualBox 下载地址 【按需下载…

【漏洞复现】Rejetto HTTP文件服务器——远程命令执行(CVE-2024-23692)

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 Rejetto HTTP文件服务器是一个轻量级的HTTP服务器软件&#xff…

最新vite脚手架配置ts-node工具

在使用最新的vite脚手架进行vue组件开发时&#xff0c;编写的ts文件工具函数的测试&#xff0c;除了应用到组件中进行页面测试&#xff0c;也可以使用ts-node工具进行单独的测试。 在使用最新版本的vite脚手架&#xff0c;生成的tsconfig配置会分出多个配置&#xff1a;tsconf…

【postgresql】时间函数和操作符

日期/时间操作符 加减操作符&#xff1a; 和 - 可以用于日期、时间、时间戳和时间间隔的加减操作。 SELECT 2024-01-01::date INTERVAL 1 day as "date"; ; -- 结果&#xff1a;2024-01-02SELECT 2024-01-01 12:00:00::timestamp - INTERVAL 2 hours as "…

类和对象的简述(c++篇)

开局之前&#xff0c;先来个小插曲&#xff0c;放松一下&#xff1a; 让我们的熊二来消灭所有bug 各位&#xff0c;在这祝我们&#xff1a; 放松过后&#xff0c;开始步入正轨吧。爱学习的铁子们&#xff1a; 目录&#xff1a; 一类的定义&#xff1a; 1.简述&#xff1a; 2…

leetcode简单题26 N.118 杨辉三角 rust描述

// 动态规划 pub fn generate(num_rows: i32) -> Vec<Vec<i32>> {let mut triangle: Vec<Vec<i32>> vec![];for i in 0..num_rows {let mut row vec![1; (i 1) as usize];for j in 1..i as usize {row[j] triangle[(i - 1) as usize][(j - 1)]…

使用阿里云镜像转存的 Harbor 国内镜像源(不定期更新)

目录 Harbor Chart 1.15.0Harbor Chart 1.14.3Harbor Chart 1.13.4 【注】主要用于 helm Charts 安装 Harbor 时自定义镜像地址。 Charts 库&#xff1a;https://artifacthub.io/packages/helm/harbor/harbor Docker 镜像库&#xff1a;https://hub.docker.com/u/goharbor 如果…

十、Java集合 ★ ✔(模块18-20)【泛型、通配符、List、Set、TreeSet、自然排序和比较器排序、Collections、可变参数、Map】

day05 泛型,数据结构,List,Set 今日目标 泛型使用 数据结构 List Set 1 泛型 1.1 泛型的介绍 ★ 泛型是一种类型参数&#xff0c;专门用来保存类型用的 最早接触泛型是在ArrayList&#xff0c;这个E就是所谓的泛型了。使用ArrayList时&#xff0c;只要给E指定某一个类型…

linux的学习(七):读取,函数,正则表达式,文本处理工具cut和awk

##简介 shell编程中的读取&#xff0c;函数&#xff0c;正则表达式&#xff0c;文本处理工具的简单使用 read read&#xff1a;读取控制台的输入 参数&#xff1a; -p&#xff1a;指定读取时的提示符-t&#xff1a;等待读取的时间 脚本例子 编写i.sh脚本&#xff0c;enter…

Android Studio引入ndk编译的so库, 通过jni给Java程序使用

前言 工作要求将一个C老项目的函数用ndk打包成库给安卓同事的java程序调用。 这个任务我debuff拉满&#xff1a; 自己之前从来没接触过安卓开发&#xff0c;问了老板为什么不让安卓开发来干&#xff0c;老板说安卓开发不懂c&#xff0c;公司就我一个是懂c的。。。项目开发年…

自定义短语 - 那些年狠狠惊艳了我们的输入法使用技巧

你是不是每次注册或者登录的时候还在吭哧吭哧地输入你的电话号、邮箱或者昵称&#xff1f; 你是不是在填写各种信息的时候还在一次又一次地输入自己的身份证号、银行卡号或者车牌号&#xff1f; 而我只要输入“mail”&#xff0c;我的候选框里就有6个email号待我挑选&#xf…

css实现前端水印

单处水印 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Watermark Example</title>&l…