iPhone / iPadの画像が90度回転してしまっているのをサーバ側で直す(Exif + Orientationタグ + ImageMagick + PHP)


iPhone / iPadは、縦に持って写真を撮った場合でも、内部的には横長のJPG画像+ExifのOrientationタグで回転角度を埋め込んで保存しているようです。

ではこの画像を取り出して表示・使用する場合にどうなるかというと、Orientationタグを見て縦に表示するか否かは表示するソフトウェアによる、ということになります。 しかし、投稿画像がユーザー環境によって見え方が変わるというようなことになると、これはちょっと避けたいと思うわけです。

たまたま今回、この問題に直面しているサイトが、アップロード画像をImageMagickでリサイズしてから保存しているのでした。 既存の記述(の中のImageMagickコマンド部分)はこういう状態です。

convert -resize 640×480 orgfile.jpg distfile.jpg

この既存の処理と一緒に走らせられないかなーというのが今回のお題です。

ということでさっさと結論を書いてしまうと、「-auto-orientオプションを付ける」でした。

convert -auto-orient -resize 640×480 orgfile.jpg distfile.jpg

このコマンドで生成されたファイル(例中 ” distfile.jpg ” )は、 ・Orientationの値通りに回転 ・Orientationは ” 1 ” にセット ・他のExif情報はそのまま持ち越し という状態で(+リサイズされて)保存されます。

なお、オマケとして、「ていうかそもそもExif全部消したい」というオーダーを盛り込むには、-stripオプションを付けて

convert -auto-orient -strip -resize 640×480 orgfile.jpg distfile.jpg

で ・Orientationの値通りに回転 ・Exif全削除 という挙動になります。

ということで、想像していたよりサクっとした手段があってありがたいです。

余談になりますが、GDの場合は、画像処理前にexif_read_data関数でExifを取得し、Orientationの値(1〜8)によってimagerotateで回転させる、ということになりますね。 そのまんまの記述がexif_read_dataのノートに掲載されています。

最新記事

すべて表示

小ネタです。 SQLiteを使っていて "no such table" とエラーが出た場合、 DBファイル名の指定が空になっている、という凡ミスを起こしていないかを確認してみましょう。 ・・・ そういう凡ミスをしてしばし悩んだので… ファイル名の指定が空になっている場合、一時的なインメモリDBとして保存されます(※1)。 つまりDB接続を切断すると中身は消えます。 なので接続

最近、 Goで書かれたアプリケーションサーバが起動しない! ->原因: .env ファイルが欠けていた というドタバタがありました。 結局Goと関係ないですが、この時、 「あまりGoに慣れてないのでGoの問題かと…」「DockerまだよくわかってなくてDockerの問題かと…」 というような声があったのて、あえてGoで検証してみようと思ったわけです。 さて、Goでサーバサイドのシステムを作

弊社ではかなり前からGitLab(CE)を自社環境で運用しているのですが、ふと気付くと、バージョンがだいぶ先に行ってしまっていました。 とくに最近のバージョンでは Auto DevOps なども使えるようになっていたりするので、さすがにそろそろキャッチアップしたいと考えたわけです。 現行の環境は次の通りです: GitLab 9.1.2 sameersbn/gitlab 使用 MySQL 5.6