這個問題是在用七牛上傳圖片后獲取寬高時發現的,一張圖片,用圖片瀏覽器打開始終是豎圖,但是查看屬性或者用七牛獲取寬高,卻發現寬大於高,也就是在屬性中這是個橫圖。這樣導致客戶端用該寬高來展示圖片會出現問題。
下面有個例子,可以參考:
1,圖片地址是:http://7xt44n.com2.z0.glb.qiniucdn.com/exif.png
打開可以看到是豎圖。
2,用七牛的api將所有額外信息去除,再看來這張圖片:http://7xt44n.com2.z0.glb.qiniucdn.com/exif.png?imageMogr2/strip
你會發現這圖本身其實是個橫圖。
本人對於圖形學完全沒有研究,在咨詢了一位圖形學博士后得到了答案,原來是因為相機給圖片的exif信息加上了一個Orientation,然后圖片瀏覽器會對這個屬性做出兼容,讓圖片以豎圖的形式顯示出來。下面我來對Orientation這個屬性做一些解釋。
EXIF Orientation 參數讓你隨便照像但都可以看到正確方向的照片而無需手動旋轉,這個參數有以下幾個值:
EXIF Orientation Value | Row #0 is: | Column #0 is: |
---|---|---|
1 | Top | Left side |
2 | Top | Right side |
3 | Bottom | Right side |
4 | Bottom | Left side |
5 | Left side | Top |
6 | Right side | Top |
7 | Right side | Bottom |
8 | Left side | Bottom |
說實話這個表實在太難看懂了,即使是它變成中文:
參數 | 0行(未旋轉上) | 0列(未旋轉左) | 旋轉(方法很多) |
1 | 上 | 左 | 0° |
2 | 上 | 右 | 水平翻轉 |
3 | 下 | 右 | 180° |
4 | 下 | 左 | 垂直翻轉 |
5 | 左 | 上 | 順時針90°+水平翻轉 |
6 | 右 | 上 | 順時針90° |
7 | 右 | 下 | 順時針90°+垂直翻轉 |
8 | 左 | 下 | 逆時針90° |
滿眼的上下左右真是看的眼花。網上流傳的還有一張圖示:
這張圖里的數字 對應的就是表格里的數字。我來看着這個圖用我自己的理解給大家解釋一下,可能不標准,但是能助於你理解這個參數:
表格里的0行,你可以理解為你看到的旋轉后(加上參數,被瀏覽器自動旋轉)的圖片的上方向,0列你可以理解為你看到的旋轉后的圖片的左方。而表格里沒一行的數據,就是該方向對應的原來的圖片的方向。
比如參數值1,0行是上,0列是左,意思也就是旋轉后的上方是原圖的上方,旋轉后的左方是原圖的左方;
參數值2,0行是上,0列是右,那就是旋轉后的上方是原圖的上方,旋轉后的左方是原圖的右方;
參數值8,0行是左,0列是下,那就是旋轉后的上方是原圖的左方,旋轉后的左方是原圖的下方;
這三個例子,配合着圖片和表格,多看即便,總能理解這個參數的意思的。
下面要講講我的處理辦法了。其實在移動端,圖片庫都會對這個參數做出兼容的,你只需要保證你的寬高不倒置,移動端就可以正常顯示。所以我的處理辦法就是圖片上傳完畢后,調用七牛的exif接口,獲取exif信息,然后對Orientation進行判斷,如果這個圖片是一個90°旋轉的圖,那就把寬高手動換一下,就可以了。