iPhone5のカメラとExif-Orientation対応
iPhone5のカメラにはとても満足しております。
これまでが4だったので尚更なんですが、静止画も動画もとても良い。
動画の手ブレ補正もすこぶる良いし、E-5が手元に無いときのカメラは、静止画も動画もiPhone5のみで全然問題ないね。
さておき、そんなiPhoneで撮った画像をアップしようとしたら、縦位置の画像が横位置になっていた。
。。。あれ?
プレビューアプリで元画像を見てみたら「画像方向 6」となっております。
縦位置で撮影した場合、画像データ自体は横位置のままで、Exif情報に90°回転するという情報が追加されているという訳ですが、これって前からこうでしたっけ。。?
というわけで、今後iPhoneからの更新も増えるやもということでExif-Orientationに対応してみた。
PHP5では標準でExifを読み込むexif_read_data()があるので、
$exif = exif_read_data($file_path);
とすればExif情報が取得でき、回転についての情報は、$exif["Orientation"] で取得できます。
ただ、問題が2点。
1つ目はiPhoneから投稿する場合はメール添付で送ることになるのだけど、メールトリガーでPHPを実行し、Mail_mimeDecode()で画像部分を取り出した際に、imagecreatefromstring()で画像リソース化するとexif_read_data()が使えない。
かといって、これをimagejpeg()で一旦保存するとこの時点でExifが消えてしまう。
で、少し悩んでしまったけれどシンプルに、
file_put_contents($file_path, $parse_data);
で保存すればよかったのでした。
で、保存後にExif-Orientationを取得し、
1:通常そのまま
2:上下反転
3:180°回転
4:左右反転
5:反時計回りに90°回転 上下反転
6:時計回りに90°回転
7:時計回りに90°回転 上下反転
8:反時計回りに90°回転
の処理をかけてやれば良いのだけど、ここで2つ目の問題。
GDでは左右反転、上下反転ができない。
そもそものiPhone対応だけを考えれば、回転だけサポートしておけば良いのだろうけど、他にも応用することなどを考えて、どうせならちゃんと反転にも対応しておきたいところ。
あと、ImageMagickを使えば簡単にできるのだろうけど、これまた他に応用する際のことを考えるとGDだけで頑張りたい。
そんなこんなで力技。
$rev = imagecreatetruecolor($w,$h);
for ($i=0; $i<$w; $i++) {
for ($j=0; $j<$h; $j++) {
$cindex = imagecolorat($src, $i, $j);
$colors = imagecolorsforindex($src, $cindex);
$x = ($rev_x == 1) ? abs($i - $w + 1) : $i;
$y = ($rev_y == 1) ? abs($j - $h + 1) : $j;
imagesetpixel($rev, $x, $y, imagecolorallocate($rev, $colors["red"], $colors["green"], $colors["blue"]));
}
}
最初にExif取得用に一旦保存する際にこの処理をすると、画像サイズによっては時間がかかりすぎてしまうので、回転やらリサイズ、トリミング等の処理が終わった一番最後に実行すること。
とりあえずはこれでうまくいったのだけど、もう少しスマートなやり方がないものでしょうかね。。。