關(guān)于手機拍攝圖片旋轉(zhuǎn)属提、Exif Orientation、pillow Image open 問題

翻譯轉(zhuǎn)自jdhao's blog

前幾天病往,我在工作中遇到了一個奇怪的錯誤捣染。我的同事給了我一些用智能手機拍攝的照片。在他們的計算機上(Windows 7)停巷,所有照片均以橫向模式正確顯示耍攘。但是,當我查看這些照片時畔勤,發(fā)現(xiàn)其中一些照片是以縱向模式(旋轉(zhuǎn)90或270度)或上下顛倒(旋轉(zhuǎn)180度)顯示的蕾各。

我很好奇發(fā)生了什么,并了解了 Exif及其所有相關(guān)內(nèi)容硼被。

Exif定向如何工作

什么是Exif

Exif(可交換圖像文件格式)是一種協(xié)議,用于存儲有關(guān)數(shù)碼相機拍攝的圖像的各種元信息渗磅。Exif與實際圖像數(shù)據(jù)一起存儲嚷硫。Exif中的一些元信息包括相機制造商,快門速度始鱼,焦距仔掸,方向,拍攝時間等医清。這些元信息稱為標簽起暮,每個標簽都有一個由Exif格式標準決定的特定標簽號。標簽的完整列表及其相關(guān)信息可在此處找到会烙。

Exif方向標志

在這里负懦,我們對方向元信息感興趣筒捺。用相機拍攝照片時,可能并不總是將相機保持在相機頂部與場景頂部相對應(yīng)的位置纸厉。該博客下面的圖片 清楚地說明了這個想法:

但是系吭,無論如何握持相機,如果您在計算機上查看圖像颗品,圖像都將以正確的方向顯示肯尺。這與Exif方向標志有關(guān)。當您以非直立姿勢握持相機時躯枢,所拍攝的原始照片將存儲為旋轉(zhuǎn)圖像则吟。數(shù)字設(shè)備(可以是智能手機或數(shù)碼相機)具有傳感器,可以記錄相機的方向锄蹂,并將該信息寫入Exif中的方向標志氓仲。

Exif方向標記可以具有1到9 的9個不同值。下圖顯示了其中的八個:

通常败匹,對于數(shù)碼照片寨昙,您只會獲得標志1、8掀亩、3舔哪、6。標志2槽棍、7捉蚤、4、5代表鏡像和旋轉(zhuǎn)的圖像版本炼七。

為什么我的圖像顯示錯誤缆巧?

當您使用照片查看器檢查計算機上的圖像時,如果照片查看器可以讀取Exif信息并尊重該信息豌拙,它將基于方向信息自動旋轉(zhuǎn)原始圖像陕悬。最終結(jié)果是,無論實際存儲方式如何按傅,您都可以看到方向正確的照片捉超。

現(xiàn)在在本文開頭討論這個問題。根據(jù) 本文唯绍,Windows 8之前的Windows系統(tǒng)不會考慮Exif方向標志并按原樣顯示圖像拼岳,即,顯示原始的未旋轉(zhuǎn)圖像况芒,而不是正確旋轉(zhuǎn)的圖像惜纸。由于同事們給我的圖像可以在Windows 7計算機上正確顯示,因此我們可以得出結(jié)論,原始圖像的方向正確耐版。不知何故祠够,智能手機為某些照片報告了錯誤的方向標記。當我在Windows 10機器上顯示這些照片時椭更,由于Windows 10遵循方向標記哪审,由于錯誤的方向標記,某些圖像將顯示為旋轉(zhuǎn)虑瀑。

另一方面湿滓,如果您在Windows 10上看到正確的照片但在Windows 7機器上旋轉(zhuǎn)了一張照片,那是因為原始圖像處于旋轉(zhuǎn)位置舌狗,并且Windows 7不遵守Exif中的方向信息叽奥。

讀取和寫入Exif信息

IrfanView

IrfanView是Windows上出色的圖像查看器,它尊重圖像Exif信息痛侍。要查看圖像Exif信息朝氓,請打開圖像,然后單擊Image -> Information主届。如果圖像包含Exif信息赵哲,則可以單擊EXIF info彈出窗口左下方的按鈕以檢查圖像Exif信息。

禁用IrfanView的自動旋轉(zhuǎn)

默認情況下君丁,IrfanView會遵守Exif信息枫夺,并將根據(jù)其方向標記自動旋轉(zhuǎn)圖像。要禁用此行為绘闷,請轉(zhuǎn)到Options -> Properties/Settings橡庞,單擊JPG/PCD/GIF并取消選中該框Auto-rotate image according to EXIF info (if available)

Pillow和Exif信息

如果您使用Pillow讀取圖像并顯示或再次保存印蔗,則Pillow將不遵守Exif方向標簽扒最。您可能在這里這里看到這樣的問題。有一個 拉取請求可以解決此問題华嘹,該請求現(xiàn)已合并吧趣。

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的值類型诡曙,因此 當我們嘗試轉(zhuǎn)儲exif_dict時可能會 遇到ValueError臀叙。閱讀piexif的源代碼之后,我現(xiàn)在使用下面的代碼行來解決此問題价卤。

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

之后劝萤,您應(yīng)該能夠正確地轉(zhuǎn)儲exif_dict

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慎璧,一起剝皮案震驚了整個濱河市床嫌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胸私,老刑警劉巖厌处,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岁疼,居然都是意外死亡阔涉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門捷绒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑰排,“玉大人,你說我怎么就攤上這事暖侨⊥肿。” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵它碎,是天一觀的道長函荣。 經(jīng)常有香客問我,道長扳肛,這世上最難降的妖魔是什么傻挂? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮挖息,結(jié)果婚禮上金拒,老公的妹妹穿的比我還像新娘。我一直安慰自己套腹,他們只是感情好绪抛,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著电禀,像睡著了一般幢码。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尖飞,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天症副,我揣著相機與錄音店雅,去河邊找鬼。 笑死贞铣,一個胖子當著我的面吹牛闹啦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辕坝,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窍奋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酱畅?” 一聲冷哼從身側(cè)響起琳袄,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纺酸,沒想到半個月后挚歧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡吁峻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年滑负,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片用含。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡矮慕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啄骇,到底是詐尸還是另有隱情痴鳄,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布缸夹,位于F島的核電站痪寻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虽惭。R本人自食惡果不足惜橡类,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芽唇。 院中可真熱鬧顾画,春花似錦、人聲如沸匆笤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炮捧。三九已至庶诡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咆课,已是汗流浹背末誓。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工璧函, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人基显。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像善炫,于是被迫代替她去往敵國和親撩幽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353