2013/07/10

[IOS] iPhone&iPad PHPで画像の向きを変える

画像の投稿時に起こる反転と回転処理

iphoneやipadでホームボタンを上にして写真を撮りWEBにアップロードすると
画像が寝転んでしまう・・・
もしくは、ホームボタン左にすると左右上下逆になってしまう・・・

どうやらappleはカメラ撮影時のメタデータに特殊なデータを仕込んでいるようで、
もちろん他の環境では、そんなデータを読んでるわけもなく
見え方がおかしくなってしまう。

そこでとても参考になったのが

PHPで画像の向きを修正する方法

貴方は神様ですか?


恥ずかしながら、exif情報の回転の部分まで頭が回らず
職場の特定の人を撮影すると起こる○○さん現象と名付けていた。
この記事のおかげでオカルトチックな脳内解決に終止符を打つことができて
本当によかった。

もろパクリみたいになるけど、一応無くなった時のバックアップのためコードを
残しておきます。


 
$img_path = '/server_path/hoge.jpg'; //向きを調べる画像のパス
$save_path = '/server_path/moge.jpg'; //向きを変えた画像を保存するパス
$exif_datas = exif_read_data($img_path);
if(isset($exif_datas['Orientation']) && $exif_datas['Orientation'] == 6){
    $source = imagecreatefromjpeg($img_path);
    $rotate = imagerotate($source, 270, 0);
    imagejpeg($rotate, $save_path, 100);
}
//画像を上書きする場合、$img_pathと$save_pathを同一のものにします。


Orientation、このキーが
apple独自の回転引数になっている模様。
ちなみにipadminiでホームボタン上にして撮影後
アップロードすると、Orientationの値は8になってました。
※Orientation 8の時はrotateは-270にしないとまた変な風にずれます。
ついでのついでに、ホームボタン左にして撮影すると、Orientationは3になります。
rotateは180度に回転させないと、これまたずれます。

imagerotate関数で画像の回転を行って、imagejpegで上書き作業を行っています。
objective-cでやろうかと思ったけど、これobjective-cでやると
めちゃめちゃメモリ食うしなんならバグ含みのメソッドを使うので
phpでやるのが吉だと判断しました。


7/12:追加
取得できたデータ配列をのせときます。


 
$img_path = $file_full_path; //向きを調べる画像のパス
$save_path = $file_full_path; //向きを変えた画像を保存するパス
$exif_datas = exif_read_data($img_path);

if(isset($exif_datas['Orientation'])){
    switch ($exif_datas['Orientation']){
        case(3):
 $rotation=180;
 break;
        case(8):
 $rotation=90;
 break;
        case(6):
 $rotation=-90;
 break;
        default:
 $rotation=0;
 break;
    }
    $source = imagecreatefromjpeg($img_path);
    $rotate = imagerotate($source, $rotation, 0);
    imagejpeg($rotate, $save_path, 100);
}