• home > theory > multimedia > CG-CV-IP >

    JPEG/Exif/TIFF格式解读(4):win10照片旋转win7不识别。

    Author:zhoulujun Date:

    Exif元数据根据不同的内容分布在五个不同的IFD中。IFD0中的数据是由TIFF定义的基本图像数据,其中有些与照片无关,所以Exif只实现其中一小

    Exif元数据根据不同的内容分布在五个不同的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