关于手机拍摄图片旋转、Exif Orientation、pillow Image open 问题

翻译转自jdhao's blog

前几天,我在工作中遇到了一个奇怪的错误。我的同事给了我一些用智能手机拍摄的照片。在他们的计算机上(Windows 7),所有照片均以横向模式正确显示。但是,当我查看这些照片时,发现其中一些照片是以纵向模式(旋转90或270度)或上下颠倒(旋转180度)显示的。

我很好奇发生了什么,并了解了 Exif及其所有相关内容。

Exif定向如何工作

什么是Exif

Exif(可交换图像文件格式)是一种协议,用于存储有关数码相机拍摄的图像的各种元信息。Exif与实际图像数据一起存储。Exif中的一些元信息包括相机制造商,快门速度,焦距,方向,拍摄时间等。这些元信息称为标签,每个标签都有一个由Exif格式标准决定的特定标签号。标签的完整列表及其相关信息可在此处找到。

Exif方向标志

在这里,我们对方向元信息感兴趣。用相机拍摄照片时,可能并不总是将相机保持在相机顶部与场景顶部相对应的位置。该博客下面的图片 清楚地说明了这个想法:

但是,无论如何握持相机,如果您在计算机上查看图像,图像都将以正确的方向显示。这与Exif方向标志有关。当您以非直立姿势握持相机时,所拍摄的原始照片将存储为旋转图像。数字设备(可以是智能手机或数码相机)具有传感器,可以记录相机的方向,并将该信息写入Exif中的方向标志。

Exif方向标记可以具有1到9 的9个不同值。下图显示了其中的八个:

通常,对于数码照片,您只会获得标志1、8、3、6。标志2、7、4、5代表镜像和旋转的图像版本。

为什么我的图像显示错误?

当您使用照片查看器检查计算机上的图像时,如果照片查看器可以读取Exif信息并尊重该信息,它将基于方向信息自动旋转原始图像。最终结果是,无论实际存储方式如何,您都可以看到方向正确的照片。

现在在本文开头讨论这个问题。根据 本文,Windows 8之前的Windows系统不会考虑Exif方向标志并按原样显示图像,即,显示原始的未旋转图像,而不是正确旋转的图像。由于同事们给我的图像可以在Windows 7计算机上正确显示,因此我们可以得出结论,原始图像的方向正确。不知何故,智能手机为某些照片报告了错误的方向标记。当我在Windows 10机器上显示这些照片时,由于Windows 10遵循方向标记,由于错误的方向标记,某些图像将显示为旋转。

另一方面,如果您在Windows 10上看到正确的照片但在Windows 7机器上旋转了一张照片,那是因为原始图像处于旋转位置,并且Windows 7不遵守Exif中的方向信息。

读取和写入Exif信息

IrfanView

IrfanView是Windows上出色的图像查看器,它尊重图像Exif信息。要查看图像Exif信息,请打开图像,然后单击Image -> Information。如果图像包含Exif信息,则可以单击EXIF info弹出窗口左下方的按钮以检查图像Exif信息。

禁用IrfanView的自动旋转

默认情况下,IrfanView会遵守Exif信息,并将根据其方向标记自动旋转图像。要禁用此行为,请转到Options -> Properties/Settings,单击JPG/PCD/GIF并取消选中该框Auto-rotate image according to EXIF info (if available)

Pillow和Exif信息

如果您使用Pillow读取图像并显示或再次保存,则Pillow将不遵守Exif方向标签。您可能在这里这里看到这样的问题。有一个 拉取请求可以解决此问题,该请求现已合并。

Pillow能够读取图像的Exif信息,但无法编辑Exif信息。下面显示了显示图像Exif信息的示例脚本:

from PIL import Image
from PIL. from PIL.ExifTags import TAGS

img = Image.open('test.jpg')

exif = img.getexif()

for k, v in exif.items():
    print('{}: {}'.format(TAGS[k], v))

在上面的脚本中,我们使用 Image.getexif()3检索图像Exif信息。 TAGS 是将标签号映射到描述性名称的词典。

Piexif

Python程序包piexif可用于读取和写入图像Exif信息。

基于 其文档站点上的 示例,我展示了一个更改图像Exif方向标记并使用新的Exif信息保存新图像的示例。

from PIL import Image
import piexif

img = Image.open('test.jpg')
if "exif" in img.info:
    exif_dict = piexif.load(img.info['exif'])

if piexif.ImageIFD.Orientation in exif_dict['0th']:
    exif_dict['0th'][pixeif.ImageIFD.Orientation] = 3

    # quick and dirty work around to avoid type error
    exif_dict['Exif'][41729] = b'1'

    exif_bytes = piexif.dump(exif_dict)

img.save('new_img.jpg', exif=exif_bytes)

Exif的主要信息存储在的0th键中exif_dict,该键也是Python字典。似乎piexif并未检查Exif dict的值类型,因此 当我们尝试转储exif_dict时可能会 遇到ValueError。阅读piexif的源代码之后,我现在使用下面的代码行来解决此问题。

exif_dict['Exif'][41729] = b'1'

之后,您应该能够正确地转储exif_dict

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342