【PHP】画像を回転、上書き保存する

PHPで画像を回転するには imagerotate を使います。

imagerotate(任意画像の画像作成関数が返す画像リソース, 角度, 回転後カバーされない部分の色(だいたい0で良い));

なぜこれが必要になったかというと、iphoneで縦長に撮った画像をアップロードした時に横長の状態で保存されてしまうのをどーにかしたかったという事情があります。

これ、原因はiphoneでのブラウジングの際は『Exif』という画像情報部分に向きがかき込まれていてそれで判定しているらしいです。だから、それを読み込まずにアップロードすると全部横長に保存されてしまうとのこと。面倒なことです。

んで、回転するためのコードは以下のような感じです。下記は扱う画像がjpgの場合です。

// まず画像ファイルのパスと回転角度を。180の場合は上下反転します
$filename = 'test.jpg';
$angle = 180;

// コンテントタイプ
header('Content-type: image/jpeg');

// imagecreatefromjpegで画像リソースIDを取得
$source = imagecreatefromjpeg($filename);

// 取得した画像リソースIDと指定角度で、画像を回転させる。
$rotate = imagerotate($source, $angle, 0);

// 回転した画像を上書きする場合は、imagejpegの保存先パスに元ファイルと同じものを指定。
imagejpeg($rotate, $filename, 100);

// 最後にメモリの解放
imagedestroy($source);
imagedestroy($rotate);

これで画像を回転して上書きすることが出来たと思います。

ただ、これには1つ落とし穴があります。
それは、扱う画像の縦横のサイズが大きいとメモリエラーになって処理が止まってしまいます。ちゃんと計ったわけなありませんが一辺が2000を越えるくらいだとエラーになるっぽい?

ということはつまり、iphoneで撮った写真そのままだと回転させられませんでした!(ずーん)
自分はこのエラーを突き止めるのに小一時間以上かかってしまいました。。
やっぱりちゃんと回転させるにはライブラリとか使わないと無理かなー。むぅ。。

よくわかるPHPの教科書 【PHP5.5対応版】 (教科書シリーズ)
よくわかるPHPの教科書 【PHP5.5対応版】 (教科書シリーズ)
ー Amazon.co.jpで買う