2014年3月5日 星期三

使用 GraphicsMagick 將圖片轉正

早期數位相機儲存的照片不帶有方向資訊,所以需要再手動把相機撗擺所拍出來照片轉正。而如真新一點的照像機,包含智慧型手機會在檔案裡加入像是焦距、光圈…等資訊,而方向也是其中之一。在這裡可以看到其中的定義,在 Windows 8 或是在 Mac 中看到的圖片縮圖、預覽會先抓取這個資訊預先轉正,所以平常沒有這種感覺。

不過瀏覽器是一個例外,由同事測試得到的資訊,在 iPad 上的 Safari 會自動偵測圖片方向,並作轉正的動作。而其它 PC / Mac / Android 的瀏覽器都還是用圖片原來內容呈現。

這造成一個問題,當使用者利用手持裝置拍照並直接上傳,在瀏覽器所看到的圖片方向是不能被預期的。因此才會有使用 GraphicsMagick 來替所有上傳圖片作轉正的需求。

轉正工作分成兩個部分,首先是判讀圖片方向,再來才是旋轉圖片。由於網路上找到的教學都只教旋轉圖片,卻沒提到怎麼判斷圖片方向。花了一些時間使用命令列呼叫 GraphicsMagick 的「gm」指令完成這些測試,先將測試結果分享在這裡。

判讀方向上,資訊被放在 EXIF:Orientation 裡,若要單獨顯示某張圖片的方向,可以用下面的指令。
gm identify -format "%[EXIF:Orientation]" [圖片檔名]

如果回傳值是 1,表示圖片不需要旋轉。而其它數字代表的意思,可以查前面提到的網站。使用 -format 將回傳值限定只有方向資訊,原因在於作為之後和程式串接時的準備,以我的例子是為了和 Java 串接,單純的回傳值在解析字串的時候比較容易。

不過 1 以外的方向數值代表意義其實不太重要,因為 GraphicsMacigk 的 convert 指令有個方便的參數「-auto-orient」,可以把圖片自動轉正。前面的命令實際上的目的只有判斷要不要作旋轉,用來節省一些不必要的轉換時間。所以只有帶一行…
gm convert -auto-orient [圖片檔名] [輸出圖片檔名]
就可以把圖片轉正。

轉正後的圖片,在電腦上預覽的時候,方向反而不正確了。這是因為 GraphicsMacik 只有旋轉內容,並沒有去改變圖片的方向資訊。因此還需要修改圖片的方向資訊才行,否則本來在 iPad Safari 裡正常顯示的圖片反而方向錯亂。不幸的是,花了我許多時間仍然沒有找到可以修改方向屬性的指令,只看到一個清空資訊的參數「strip」。經過測試,瀏覽器會把它視為不需要旋轉的圖片,就像早期照機所拍出,沒有帶方向資訊的圖。

因此最後的指令為…
gm convert -auto-orient -strip [圖片檔名] [輸出圖片檔名]

我認為應該還有其它更好的解法,不過暫時沒時沒再深入研究下去了,先將就用用。

沒有留言:

張貼留言