2019年4月19日 星期五

修正 iPhone 相機照片無故旋轉的問題


有時候,你會發現在 iPhone 上拍的照片 (我不清楚 Android 手機是否有一樣的問題) 傳到電腦中會出現旋轉 90 度、甚至是上下顛倒的怪事。事實上這個問題存在已久,在比較新的作業系統中 (比如 Windows 10,而 macOS 在我的印象中沒發生過),其預設的圖片瀏覽軟體已經解決了此問題,但考慮到目前 Windows 7 的用戶依然非常多 [1],且 macOS 也不是完全與此無緣,故這次來講一下問題的起因及解決方法。

這件怪事的起因在網路上早有很多人討論,比如說 Why Your iPhone Photos Are Upside Down & How To Fix That 這篇文章,其他還有很多。不過他們的發文時間都是很多年前了,恕我不客氣地說,他們提出的解決方法都非常低效,所以在這篇文章中我會盡量以系統內建的軟體,談談如何自動化這個過程。


以上圖我隨便在實驗室拍的照片為例,從預覽程式 (Preview.app) 的檢閱器 (Inspector) 視窗中可知,雖然照片看起來是直立的,但是其實還是橫置的,只是額外加了一個 "Orientation" 的標籤去讓它旋轉 90 度而已。所以,如果該圖片瀏覽 / 處理軟體不支援讀取 Orientation 標籤,則會得到一個錯誤旋轉方位的圖片,像 Windows 7 的圖片預覽器 (Photo Viewer) 即為如此,而這軟體從 XP 就存在於 Windows 中,故這個問題應該存在於所有老一點的 Windows 電腦。

有果粉會說:「哎唷,不就是因為 Windows 爛嗎?macOS 萬歲!」其實不然,之所以變成這樣是有歷史原因的。在過去,人們並沒有用手機拍照的習慣,即使在 iPhone 問世之後,其拍照的水平還差數位相機太多,直到 iPhone 4 之後才開始比較多人習慣以手機攝影。如果有用過十年前的數位相機,應該會知道當年的數位相機功能簡單,人們也是一張一張地拍攝 (不會連拍),所以相機處理器的壓力也小,只要相機檢測出你正在拍攝直立照片,系統就自動幫你把照片轉向,如果沒有偵測到或是不支援此功能,手動轉也不是很大的負擔,畢竟當年一般人不會處理那麼多照片。

Windows 7 雖然直到今天依然是個非常熱門的作業系統,但要知道它已經將近十歲了,那時手機攝影尚未成氣候,所以讀取這些 EXIF 標籤的事自然是可有可無。2011 年 iOS 5 問世,將 iPhone 拍的照片加入 Orientation 標籤,從此之後 iPhone 相機拍出來的照片都是一樣的橫置方向,僅靠 Orientation 標籤去告知圖片軟體正確的位向。我並不清楚蘋果這樣做的起因,估計是為了減輕 HDR 及日後連拍功能造成的處理器及 RAM 的壓力,因為相機 CCD 感光元件並不知道相片的旋轉位向,每次從重力感應器讀取資訊後都要進行一次旋轉,而旋轉一張照片並不是那麼簡單,中間有著大量的矩陣運算,還要用 RAM 當暫存的緩衝區,對於日益增加解析度的手機照片及摳得要死的 iPhone RAM 都是不小的負擔。然而,上述那一切發生時,Windows 7 早已發售,當然搭不上這班順風車,要等到 Windows 10 才有官方支援的圖片瀏覽器 (Photos),而 macOS 幾乎年年更新,該修正的都修了,用戶自然不會發現這些問題。


從上述的發生起因,我們可知這其實只是軟體支援度的問題,只要安裝一個支援讀取 Orientation 標籤的軟體就解決了。可是,你不能要求別人都安裝某某軟體,所以在分享照片給別人之前,自己把照片轉好才是比較好的解決方法,上圖就是轉好的例子,仔細觀察紅框中的變化。


macOS 上的解決方案
首先要知道,如果發現圖片無故轉了一個角度,直接旋轉圖片將其轉回來是最蠢的方法,因為你不知道下一張圖片要轉幾度,順時針 90 度還是逆時針 90 度?或是 180 度?所以我們要做的是讓圖片的旋轉位向正確,且 Orientation 標籤顯示 "1 (Normal)",也就是沒有旋轉。

1. 用預覽程式 (Preview.app):
經過逐年的更新,預覽程式早已是媲美商業級圖片處理軟體的存在,只要用它處理圖片,即可自動修正旋轉方位的問題。它的內建功能 "旋轉" 在這裡不好用,而且我沒有真的要圖片旋轉,所以我用 "調整大小" (Adjust Size...),縮放大小設定為 100%,看似啥也沒幹,實際上已經將圖片修正好了,操作如下圖。


別忘了,預覽程式是支援批量處理的:



2. 用 Automator 圖片模組:
預覽程式很好用,可是在自動化上功能單一,沒辦法串連其他修圖功能,所以很自然地我們會把腦筋動到 Automator 上,可惜的是結果是非常悲觀的 ....



  • Flip Images:翻轉圖片兩次,沒用,但不會抹除 EXIF 資訊。
  • Scale Images:縮放 100%,沒用,但不會抹除 EXIF 資訊。
  • Rotate Images:旋轉 180 度兩次,有用,但其餘的 EXIF 資訊全數被抹除 (如下圖)。

被抹除後的 EXIF 資訊

總之上述三個都是不可行或很爛的方案,看看它們的 "生產日期",這種年久失修的模組會有這樣的表現也不是很令人意外啦 ....


3. 用 ImageMagick:
難以置信的是,專業老牌圖像處理軟體是不支援 Orientation 標籤的 (也許是因為 "老牌"....),我在開發 Merge Images 的時候才發現此事,所以 Merge Images 裡面已經內建自動轉向功能了。如果要將此功能獨立出來也很簡單,只要將以下 AppleScript code 放進 Automator 中即可:

on run {input}
repeat with imgItem in input
set imgItem to quoted form of POSIX path of imgItem
do shell script "/usr/local/bin/mogrify -auto-orient " & imgItem
end repeat
return input
end run


Merge Images 相同,這個 Automator 工作流程也支援後續串連其他模塊,比如 Rename Finder Items (重新命名) 或 Scale Images (縮放圖片) 等等。另外,我用的指令是 mogrify,它會將處理後的圖檔取代原檔,而用 convert 指令可以做到一樣的事,但會另存新檔,有需要的人可以在安裝 ImageMagick 後在終端機 (Terminal) 輸入 "man convert" 去查看使用方法。另外,剛轉出來的圖檔在 Finder 的預覽圖中會顯示錯誤的位向,但是在 Quick Look 及預覽程式視窗中都是沒問題的,我試過重啟 Finder 無效,估計要等 Finder 快取檔更新後才會修正,這不影響檔案轉向的實際效果。


iOS 上的解決方案
畢竟問題照片來自 iPhone,若不能在 iOS 內修正,總感覺問題還是沒解決,而解決方法異常簡單,且比 macOS 簡單太多,用捷徑即可!


非常簡單且看似無意義的動作:旋轉 0 度,圖片就轉好了,還支援多圖片批量轉換,果然受寵的小兒子就是不同啊 (再看一次那年久失修的 Automator....)!這裡有兩個值得注意的地方:1. 由於 "Rotate images" 動作有奇怪的 bug,如果以 App Extension (應用程式擴展,也就是 Open In > Shortcuts > XXX 的使用方式) 的形式去使用會閃退,所以我用 "Select Photos" 來輸入圖片;2. 如果用 "Quick Look" 動作去預覽再手動存檔,圖片的檔名依然會以 "IMG_" 開頭,但若用 "Save to Photo Album" 直接存檔,檔名的開頭就是四個隨機的字母,在 iPhone 上看都一樣,可是匯入到電腦中就不同了,提醒各位一下。

以上,有疑問或建議歡迎在下方留言。



附註
1. Windows 10 儘管有很多新的技術,但直到今天還有很多 bug 沒有解決 (比如說文件瀏覽器在某些情景下就是會出不來等匪夷所思的 bug),而系統更新的通知依然煩人,讓人感覺微軟根本不尊重用戶,只是怕系統漏洞被攻擊會被用戶投訴,所以用戶體驗的優先級非常低。最後,很多第三方硬體 (特別是古老的科研硬體,一用就五年以上的那些卡) 在 Windows 10 有不少相容性問題,加上上述種種缺點,Windows 10 的市佔率上升很大一部分的原因是用戶被 OEM 及學校 / 公司網管的強迫升級,並非自發性的。

2 則留言:

  1. 請問iOS解決方案裡面的auto-orient image要在哪裡選?謝謝

    回覆刪除
    回覆
    1. 那是我自己設定的捷徑名稱,沒得選。

      刪除