你直立拍了一張照片。手機上看是正的,相簿裡是正的,Email 給自己也是正的。然後你上傳到某個地方,它橫躺著。沒有東西轉過那張圖,像素從頭到尾沒有動過。變的是「誰在讀它」。
相機的感光元件是一個固定的長方形,以某一個方向被實體鎖在機身裡。你把手機橫過來拍風景照時,感光元件不會跟著轉——它擷取的永遠是同一個長方形。
那照片為什麼出來是正的?手機偵測到你拿的方向,然後把它記下來。不是靠重新排列像素——那會花時間和電——而是在檔案的中介資料裡存一張小紙條:EXIF 方向標籤。
這個標籤有八種值。講白一點,它說的是「顯示之前先順時針轉 90 度」或者「這張本來就是正的」。兩種情況下像素資料一模一樣,不同的只有那句指示。
每個打開這張圖的程式,都得自己決定要不要照那句指示做。現代軟體大多會。有些軟體不會——而且很多上傳管線為了隱私或檔案大小會把中介資料整個剝掉,那等於把指示刪了。
結果就是一張照片同時既是正的也是橫的,看是誰在看:
這就是為什麼這個問題感覺很隨機。它不隨機——那是程式之間對一張一直都在的紙條有不同意見。
移除中介資料通常是好事。EXIF 帶著 GPS 座標、裝置型號、精確到秒的時間戳——那些大多數人並不打算跟照片一起公開。很多服務預設就剝掉,而且做得對。
但方向標籤和 GPS 座標住在同一個區塊裡。把那個區塊移除,旋轉指示也一起被移除了。照片現在用它原始的像素方向顯示——也就是感光元件當初擷取到的那個方向。你橫著拿手機,它就是橫的。
可靠的解法是旋轉影像資料本身,讓像素就是正的,方向標籤因此變得多餘。這有時候叫「把旋轉烤進去」。這樣做完之後所有程式都同意,因為已經沒有什麼可以不同意的了。
步驟很簡單:
有一個要小心的地方。某些編輯器的「旋轉」是改 EXIF 標籤而不是搬像素——快、無損、而且對這個問題完全沒用,因為它重建的正是你想逃離的那個狀況。測試方法是把結果上傳到一個會剝中介資料的地方,看它還正不正。
一張橫躺的照片是小困擾。一百張、一半橫幅一半直立、全部混在一起,才是真的問題——因為你沒辦法對整批套用同一個旋轉。每張照片需要的是它自己的標籤所指定的那個角度。
任何「依照每個檔案既有的方向標籤去轉」的做法都能正確處理混合批次。套一個「全部轉 90 度」會修好一半、弄壞另一半。
尺寸看起來顛倒了。一張直立照片顯示成 4032 × 3024 而不是 3024 × 4032。那是誠實的像素尺寸;標籤本來打算在顯示的時候把它修正。
縮圖是正的,完整圖不是。EXIF 可以內嵌一張小預覽圖,而那張預覽可能已經轉過了。檢視器顯示的是正確的縮圖和橫躺的原圖。
在某個瀏覽器正確,另一個不正確。這些年來各家瀏覽器對方向的處理並不一致,尤其是 CSS 背景圖和 <img> 標籤之間的差別。
如果你是在為網站、沖印或任何「你不會馬上看到結果」的場合準備照片,交出檔案之前先把旋轉烤進去,每一次都值得那個多出來的步驟。