xif元数据根据不同的内容分布在五个不同的IFD中。

  1. IFD0中的数据是由TIFF定义的基本图像数据,其中有些与照片无关,所以Exif只实现其中一小部分。这部份数据在Photoshop中称为TIFF元数据。

  2. Exif subIFD中的数据是由Exif定义的元数据,都是和相机照片有关的数据,是Exif的主要数据,其中有一些与IFD0中的重复。

  3. GPS subIFD 中的数据是记录照片的拍摄位置,对于没有GPS功能的相机,这里的数据都是空的。

  4. IFD1中的数据是缩略图的图像及该图像的元数据。

  5. Maskernote IFD中是制造商自己定义的元数据,没有标准,有些商家的数据也不对外公开。

一般谈论的Exif数据都是指Exif subIFD 和IFD0 中的数据。

Exif数据是在拍摄时由相机软件生成並嵌入到JPG文件中,没有规定必需生成哪些数据,一般就选几个常用的,不同厂商也有不同的选择,这就是为什么不同相机拍的照片其Exif所包含的内容不一样。

Exif定义了大量的元数据,其中有一部分很少用到,还有一些比较直观易懂,这里仅对几个容易产生疑问的做些解释。

exif信息解读

比如某相机拍摄出来的相片,文件分辨率比如宽度7360像素,高度4912像素

  • 十进制表示为 DEC : 7360 * 4912

  • 十六进制则为 HEX : 1CC0 * 1330

默认情况下,会在00000030:07标志位(不同设备或程序生成的图片的标志位会有所不同,由EXIF内容而定)上存放01值表示原始文件的位置,无论这张图是横着拍的还是坚着拍的,初始值为01

拍摄时相机方位,横向还是纵向。用数值表示旋转的方向,但更多是先设定原始图片的上边为0行,左边为0列,用行列的位置来解读转动的方位,所以“上左”(0行为上,0列为左)为原始位置,“右上”(0行为右,0列为上)即上边变为右边,左边变为上边,顺时针转90度。如下表所示。 x

数值 0行 0 列 旋转说明
0 上左 原始位置
3 下右 180度
6 右上 顺时针90度
8 左下 逆时针 90 度

那么图片,在Windows 10操作系统下,通过操作系统自带的“相片”程序进行旋转时,仅仅对此标志位进行改变,而图片的内容不会做任何改变,包括旋转后的宽度与高度也不会做改变,包括JPEG和EXIF中的宽度与高度信息。

  1. 向右旋转90度,标志位为06

  2. 再向右旋转90度,即旋转了180度,标志位为03

  3. 再向右旋转90度,即旋转了270度,标志位为08

  4. 再向右旋转90度,即旋转了360度,回到原图,标志位还原为01

然而,在Windows 10进行旋转的图片,如果在Windows XP或Windows 7上面通过“相片”进行查看仍然显示为未旋转前的图片,因为不识别这个标志位。

资源管理器在显示分辨率那一栏中也自然是无法识别,低版本的程序无法识别高版本的标志位导致的问题。

于是,在处理旋转过后的图片,通过JDK 8.0版本去读取javax.imageio.ImageIO.read(new File(fileName)).getWidth/getHeight宽度和高度时,也是无法获知到底是不是旋转过的。

包括其他比如HypeSnap 5.6.0版本的一些旧程序,在打开时都会由于不支持这种方式而导致仍是未旋转的问题。

试过JDK 8.0/9.0/10.0均无法识别,目前最新版本的OpenJDK 13.0版本也没能识别出来旋转后的分辨率。

但是,如果是在Windows XP或Windows 7当中,对图片文件进行旋转时,文件的内容做了全面的变化。旋转后的宽度与高度也会改变并保存到EXIF中,图片内容的改变。这样旋转后的文件在其他操作系统上进行打开时都是正确的旋转后的结果。

Windows 下用缩略图视图查看图像会按照【第一步读取当前文件夹下Thumbs.db – 如果没有Thumbs.db文件则读取图像exif缩略图信息 – 如果图像文件没有exif缩略图信息则生成缩略图信息并保存至Thumbs.db】如此规则循环。

其他还有水平翻转,垂直翻转等,因照片拍摄没有这样的功能,所以没有列出。

需要指出的是只有能识别方向参数的图像软件(如Acdsee,Photoshop)才能在查看图像时自动旋转,Windows下的图片查看器没有这种功能。

名称 水平分辨率

Tag  0X011A

Tag  0XA20E

所在目录 IFD0

所在目录 Exif SubIFD

名称 垂直分辨率

Tag 0X111B

Tag  0XA20F

所在目录 IFD0

所在目录 Exif SubIFD

名称 分辨率单位

(英寸/厘米)

Tag  0X0128

Tag  0XA210

所在目录 IFD0

所在目录 Exif SubIFD

Exif工具

Exiv2:一个基于C++、跨平台的程序,可以读写图片元数据(EXIF, IPTC, XMP)。它提供了可执行文件供命令行使用,也提供了C++的API供编程。

在前端领域,可以通过exif-js识别图片的exif信息

https://www.npmjs.com/package/exif-js

参考资料:

图片文件Exif信息详细说明 blog.sina.com.cn/s/blog_651251e60102uz3d.html#AboutExif

图像Exif信息 元数据(Metadata) https://www.jianshu.com/p/a6d67df60e7e

关于图片文件旋转JPEG与EXIF信息  https://blog.csdn.net/yulimin/article/details/102827865

https://www.media.mit.edu/pia/Research/deepview/exif.html

https://baike.baidu.com/item/Exif/422825?fr=aladdin

读取JPG图片的Exif属性(一) - Exif信息简介 https://blog.csdn.net/fioletfly/article/details/53605959

读取JPG图片的Exif属性(二) - C代码实现 https://blog.csdn.net/fioletfly/article/details/54094940

读取JPG图片的Exif属性(三) - Exif属性读取GPS信息代码(C/C++实现)https://blog.csdn.net/fioletfly/article/details/54133422

在jpg图片添加Exif信息的C程序实现 https://blog.csdn.net/psy6653/article/details/79658144

JPEG添加EXIF https://blog.csdn.net/weixin_43549602/article/details/84654965

jpeg图片格式详解 https://blog.csdn.net/yun_hen/article/details/78135122

压缩算法——JPEG2000 编解码原理 https://blog.csdn.net/ytang_/article/details/76571635

PNG、JPEG、BMP等几种图片格式详解 https://www.jianshu.com/p/f5557c0e689e

使用HTTP2和渐进式JPEG图片更快的加载图像 http

转载本站文章《JPEG/Exif/TIFF格式解读(4):win10照片旋转win7不识别。》,
请注明出处:https://www.zhoulujun.cn/html/theory/multimedia/CG-CV-IP/8399.html

JPEG/Exif/TIFF格式解读(4):win10照片旋转win7不识别的更多相关文章

  1. 利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题

    html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...

  2. 详解exif.js,应用于canvas照片倒转(海报H5)

    业务背景,苹果手机调用上传接口拍照没有问题但是上传到网页上照片倒转了解决方法利用exif.js读取图片参数并对图片进行元数据修改 window.btoa(str)转码 window.atob(base ...

  3. 利用exif.js解决ios手机上传竖拍照片旋转90度问题

    html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...

  4. 利用exif.js解决手机上传竖拍照片旋转90\180\270度问题

    原文:https://blog.csdn.net/linlzk/article/details/48652635/ html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针 ...

  5. 恢复Win10照片查看器

    批处理文件: @echo off&cd\&color 0a&cls echo 恢复Win10照片查看器 reg add "HKLM\SOFTWARE\Microsof ...

  6. mismatch位置(MD tag)- sam/bam格式解读进阶

    这算是第二讲了,前面一讲是:Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶 MD是mismatch位置的字符串的表示形式,貌似在call SNP和indel的时候会用 ...

  7. 在VC下显示JPEG、GIF格式图像的一种简便方法

    在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...

  8. 非IMU模式下DML语句产生的REDO日志内容格式解读

    实验内容:非IMU模式下DML语句产生的REDO日志内容格式解读 最详细的解读是UPDATE的. 实验环境准备 11G中默认是开启IMU特性的,做此实验需要关闭此特性. alter system se ...

  9. 如何将JPG格式的图片转化为带地理坐标的TIFF格式

    最近有个项目需要用到开源软件GeoServer,数据源是一张高分辨率的2.5维图片,格式是jpg的,由于GeoServer不支持jpg格式的发布,因此考虑到要进行格式转换,将其转换成tiff格式. 1 ...

  10. 创世区块配置文件genesis.json的格式解读

    创世区块配置文件genesis.json的格式解读 中文网站上关于genesis 的解析大多数都来自于这个Gist:Ethereum private network configuration gui ...

随机推荐

  1. List、Set与 Map

    目录 1. List接口和常用方法 1.1 List接口基本介绍 1.2 List接口的三种遍历方式 2. ArrayList 2.1 注意事项 2.2 ArrayList的底层操作机制源码分析(重点 ...

  2. C# 反序列化JSON

    try { u = await WebAPIOperator.PostAsync("/v2.0/auth/user/user/login", new LoginRequestMod ...

  3. QT(4)-QAbstractItemView

    @ 目录 1 说明 2 常用函数 2.1 交替行颜色 2.1.1 alternatingRowColors 2.1.2 setAlternatingRowColors 2.2 autoScroll 2 ...

  4. 从零实现的浏览器Web脚本

    从零实现的浏览器Web脚本 在之前我们介绍了从零实现Chrome扩展,而实际上浏览器级别的扩展整体架构非常复杂,尽管当前有统一规范但不同浏览器的具体实现不尽相同,并且成为开发者并上架Chrome应用商 ...

  5. 数据库系列:InnoDB下实现高并发控制

    数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩容 数据库 ...

  6. 宏(define)与常量(const)

    既然选择了远方,便只顾风雨兼程. 宏(define) 一. 宏的理解   宏是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则 ...

  7. 深入了解HMAC加密技术:原理、应用与实践

    一.引言 在网络安全领域,消息认证码(MAC)是一种重要的技术手段.Hash-based Message Authentication Code(HMAC)作为其中的一种,凭借其简单.高效.安全的特性 ...

  8. Linux笔记01: Linux简介

    1.1 操作系统 计算机系统是由硬件子系统(处理器.内存.硬盘.键盘.鼠标.显示屏等)和软件子系统(如Windows操作系统.Office办公软件等)组成. 操作系统(Operating System ...

  9. [CF403E]Two Rooted Trees

    Two Rooted Trees 题面翻译 题目描述 你有两棵有根树,每棵树都有 \(n\) 个结点.不妨将这两棵树上的点都用 \(1\) 到 \(n\) 之间的整数编号.每棵树的根结点都是 \(1\ ...

  10. [ABC232G] Modulo Shortest Path

    Problem Statement We have a directed graph with $N$ vertices, called Vertex $1$, Vertex $2$, $\ldots ...