いろいろな記事を調査したが、コードそのままで動くものがなかった…
一番近いのが以下の記事だが、縦長に撮った写真の上下が逆さになってしまった。
www.glic.co.jp
おかしいなーと思いいろいろと調べた結果、
imagerotate()の第2引数は、反時計回りの度数を指定するので、「時計回りに90°」であれば、「反時計回りに270°」としなければならない。
http://php.net/manual/ja/function.imagerotate.php
以下私が実際に使っているコードのサンプル。
上記のサイトのサンプルコードほぼそのままなので恐縮なのだが、手を入れたので全体を掲載する。
実際には、Orientationは、1か6か8しか使わないと思われ。
<?php ini_set("display_errors", 0); error_reporting(E_ALL ^ E_NOTICE); umask(0); $create_thumbnail = 1; $thumbnail_pixels_max = 200; $tempFile = $_FILES["photo"]["tmp_name"]; $targetFile = "/path/to/target.jpg"; $thumbnailFile= "/path/to/thumbnail.jpg"; move_uploaded_file($tempFile, $targetFile); // 回転補正 // orientationFixedImageの中でimagejpeg()が呼ばれているので、回転補正後の画像は書き出されている。 // その後、サムネールを作れるように、回転後のオブジェクトを戻すようにしてある。 $image = orientationFixedImage($targetFile, $targetFile); if ($create_thumbnail) { // サムネール作成 list($width, $height) = getimagesize($targetFile); $width_s = $width >= $height ? $thumbnail_pixels_max : $width * $thumbnail_pixels_max / $height; $height_s = $width >= $height ? $height * $thumbnail_pixels_max / $width : $thumbnail_pixels_max; $thumb = imagecreatetruecolor($width_s, $height_s); imagecopyresized($thumb, $image, 0, 0, 0, 0, $width_s, $height_s, $width, $height); imagejpeg($thumb, $thumbnailFile); } // 画像の方向を正す function orientationFixedImage($output,$input){ $image = ImageCreateFromJPEG($input); $exif_datas = @exif_read_data($input); if(isset($exif_datas['Orientation'])){ $orientation = $exif_datas['Orientation']; if($image) { // 未定義 if($orientation == 0) { // 通常 }else if($orientation == 1) { // 左右反転 }else if($orientation == 2) { $image = image_flop($image); // 180°回転 }else if($orientation == 3) { $image = image_rotate($image, 180, 0); // 上下反転 }else if($orientation == 4) { $image = image_flip($image); // 反時計回りに90°回転 上下反転 }else if($orientation == 5) { $image = image_rotate($image, 90, 0); $image = image_flip($image); // 反時計回りに270°回転 }else if($orientation == 6) { $image = image_rotate($image, 270, 0); // 反時計回りに270°回転 上下反転 }else if($orientation == 7) { $image = image_rotate($image, 270, 0); $image = image_flip($image); // 反時計回りに90°回転 }else if($orientation == 8) { $image = image_rotate($image, 90, 0); } } } // 画像の書き出し ImageJPEG($image ,$output); return $image; } // 画像の左右反転 function image_flop($image){ // 画像の幅を取得 $w = imagesx($image); // 画像の高さを取得 $h = imagesy($image); // 変換後の画像の生成(元の画像と同じサイズ) $destImage = @imagecreatetruecolor($w,$h); // 逆側から色を取得 for($i=($w-1);$i>=0;$i--){ for($j=0;$j<$h;$j++){ $color_index = imagecolorat($image,$i,$j); $colors = imagecolorsforindex($image,$color_index); imagesetpixel($destImage,abs($i-$w+1),$j,imagecolorallocate($destImage,$colors["red"],$colors["green"],$colors["blue"])); } } return $destImage; } // 上下反転 function image_flip($image){ // 画像の幅を取得 $w = imagesx($image); // 画像の高さを取得 $h = imagesy($image); // 変換後の画像の生成(元の画像と同じサイズ) $destImage = @imagecreatetruecolor($w,$h); // 逆側から色を取得 for($i=0;$i<$w;$i++){ for($j=($h-1);$j>=0;$j--){ $color_index = imagecolorat($image,$i,$j); $colors = imagecolorsforindex($image,$color_index); imagesetpixel($destImage,$i,abs($j-$h+1),imagecolorallocate($destImage,$colors["red"],$colors["green"],$colors["blue"])); } } return $destImage; } // 画像を回転 function image_rotate($image, $angle, $bgd_color){ return imagerotate($image, $angle, $bgd_color, 0); } ?>