纯前端实现图片 Exif 数据编辑

前言

前段时间小米出的水印边框照片模板被大家玩的不亦乐乎,本来想着写一个实现合成各厂商带水印边框照片的工具。这个头脑一热想要开发的工具最终也没有着手实现,不过这里面有一个知识点倒是令我很感兴趣。

这一点就是:合成水印边框通常会自动带上照片的拍摄数据——光圈、快门、感光度、品牌 LOGO,那这些数据都是从哪里获取照片里面又是怎么存储的呢?

在查询了大量资料之后得知,这些参数都来自于 Exif 数据,于是对 Exif 的技术标准、读写 Exif 的 JS 框架做了一些研究,这篇文章就是据此研究总结而来。

最后,笔者还写了一个 Exif 数据编辑的 Vue 组件——exif-edit

图片格式与 Exif 数据

图像元数据有两种格式:Exif、XMP,而 Exif 就是其中一种。

Exif 全称是可交换图像文件格式(英语:Exchangeable image file format,官方简称 Exif),是用于记录数码照片的属性和拍摄数据的。属性主要是指照片的分辨率大小、缩略图,而拍摄数据主要是指光圈、快门、感光度、焦距、设备型号、镜头、GPS 位置等。

维基百科上给出的 Exif 包含的信息示例如下:

常见图片格式有 JPEG、PNG、GIF、HEIF、DNG、TIFF 等,其中已经明确能够支持写入 Exif 数据的格式有:JPEG、DNG、TIFF、HEIF。

各图片格式对于 Exif 数据支持情况如下:

格式 JPEG PNG GIF HEIF DNG TIFF BPG BMP
Exif 支持 不支持 不支持 支持 支持 支持 不支持 不支持

目前在互联网上最常见的图片格式是 JPEG 格式(文件名后缀 .jpeg),又称为 JPG 格式(文件名后缀 .jpg),我们暂且只分析 JPEG 图片中的 Exif 数据。

Exif 格式规范

Exif 数据能够嵌入到不同格式的图片中,那各个格式的图片是如何识别并解析 Exif 数据的呢?这就涉及到 Exif 数据的格式规范了。

可以简要描述为:Exif 信息数据以两个字节长度的特定标记开头,这个标记之后的两个字节记录Exif数据总的字节长度。有了 Exif 标记和所有数据总字节长度,就能知道哪些是 Exif 数据了。

这个标记是 2 字节长的 0xFFE1,这是十六进制表示,表示的是什么意思呢?且看下文解释。

我们知道计算机世界里一个字节是由 8 个二进制位组成,即 1Byte = 8bitbit 可以简写为 B),8 个二进制位的所有排列组合有 2**8 = 256 种结果;二进制中一个位有 2 种可能结果,而假设一个位有 16 种可能结果的话,8 个二进制位则可以用 2 个 十六进制位表示,因为 2 个 16 进制位所有的排列组合正好有 16**2 = 256 种结果。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
部分使用说明: 点击开始菜单-运行命令,在对话框输入: "jhead –命令参数 jpeg文件" 例如: “jhead -de D:\A.jpg” 删除D盘盘根目录下A.jpg文件的exif信息。 “jhead -de D:\*.jpg” 删除D盘根目录下所有jpg文件的exif信息。其中星号是通配符。 二、通用指令参数 -te 将其他jpeg文件的eixf导入目标jpeg。例如"jhead –te D:\B.jpg D:\A.jpg" -dc 删除jpeg信息中的备注。注意,jpeg文件有两个备注,一是和其他文件一样的备注,另一个是exif信息中的备注。jhead仅对exif信息有效。 -de 完全删除exif信息。 -du 删除非原始exif信息,例如Photoshop、Turbophoto之类编辑后修改exif留下的信息。 -purejpg 删除所有jpeg文件非必须的信息。相当于-de、-dc和-du的集合,可以将文件减小数k。 -ce 修改文件的jpeg文件头部分备注(此备注并非exif信息)。该指令会打开文本编辑器,并在编辑器关闭时将备注信息存入文件。 -cs 导出备注。例如"jhead –cs D:\988.txt D:\A.jpg" -ci 导入备注。例如"jhead –ci D:\988.txt D:\A.jpg" -cl 直接输入备注。。例如"jhead –cl 我的备注 D:\A.jpg" 三、其他指令 时间日期 -ft 将jpeg文件的“修改时间”修改为exif信息中记录的时间。 -n[] 该指令会将文件名修改为exif信息中记录的“创建时间”;如果jpeg文件没有exif或者exif中的创建时间不可用,则将文件名修改为文件的“修改时间”。 默认的格式-顺序为MMDD-HHMMSS 格式-顺序参数如下: %d-日(01-31) %H-小时(00-23) %j-一年中的第几天(001-366) %m-月(01-12) %M-分钟(00-59) %S-秒(00-59) %U-一年中的第几周(00-53) %w-星期几(0-6,周日为0) %y-两位数纪年(00-99) %Y-四位数几年 %i-添加数字序号 例如: jhead -n%Y%m%d-%H%M%S d:\*.jpg 将所有jpg文件修改为YYYYMMDD-HHMMSS.jpg的格式。 -nf 与“-n”相同功能相同,不保留原文件名。 -a 修改不同扩展名的同名文件名,相机拍摄的avi短片exif信息存储在与其同名的thm文件中,可用此指令给avi文件更名。一般与“-n”指令共同使用。 -ta 修正时差,例如时差根据时区确定,例如+1:00或者-1:00 -da- 修正日期。日期格式是yyyy:mm:dd、yyyy:nn:dd+hh:mm或者 yyyy:mm:dd+hh:mm:ss。根据前后参数时间差调整exif的时间。 -ts 直接修改exif中的拍摄时间,日期-时间格式为yyyy:mm:dd-hh:mm:ss 缩略图 -dt 删除exif中的缩略图。这个缩略图一般为240x160像素,10k大小,用于数码相机、Windows XP查看照片,删除它不会影响工作。 -st 将exif中的缩略图复制为另一个jpeg文件 -rt 用另一个jpeg文件替换exif中的缩略图 -rgt[大小] 刷新exif缩略图,其中大小为缩略图的最大边长。 旋转 -autorot 根据exif中记录的水平方向信息转动jpeg照片。 -norot 清除exif中的水平方向信息。 四、使用技巧 1)用开始菜单的"运行"指令并不直观,可以通过运行cmd命令进入DOS命令提示符界面操作。在DOS界面进入操作照片文件夹(不懂DOS操作的朋友建议稍稍学习DOS指令,今后也会受用无穷),在文件夹中运行jhead命令,用“*.jpg”表示文件夹中所有的jpeg文件,可以进行批处理。 2)-te(复制exif信息)作用在于可以恢复被其他编辑软件删除的exif信息。编辑照片之前,先在照片文件夹中建立一个名为“backup”的备份文件夹,将原是照片复制到backup文件夹中,然后再编辑照片,编辑软件可能会删除或修改exif编辑结束后进入DOS界面照片文件夹输入: jhead –te “backup\&i” *.jpg 照片的exif信息就会从backup文件夹的原始文件中复制回来。其中“&i”表示与目标文件同名的文件,前面的“backup\”表示原始文件位置。 3)-purejpg指令可以删除所有exif信息,让照片减小若干k字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值