phpで画像ファイルアップロードをした時、普通にwindowsなど、Chrome,firefox,edgeブラウザでアップロードすると問題ない。
iphoneやipadなどios のsafari で写真を撮った画像をそのまま下記でアップロードすると90度左に回転してアップされてしまう。
<input type="file" name="filename">
phpでの解決方法 下記で 1 ~ 8 を取得
Orientation = 6 が左90度回転した
$filename = // 画像
$exif_data = @exif_read_data($filename); // @exif_read_dataは、PHP8.2はExifの拡張モジュール無くても動く (exif_read_dataはExifの拡張モジュールが必要です。)
$orientation = $exif_data['Orientation'];
---------------------
1 何もしない
8 imagerotate関数で90度回転
3 imagerotate関数で180度回転
6 imagerotate関数で270度回転
2 imageflip関数で左右反転
7 imageflip関数で左右反転&imagerotate関数で90度回転
4 imageflip関数で上下反転
5 imageflip関数で左右反転&imagerotate関数で270度回転
---------------------------
//画像ロード
$image = imagecreatefromjpeg($filename);
//回転角度
$degrees = 0;
switch($orientation) {
case 1: //回転なし(↑)
return;
case 8: //右に90度(→)
$degrees = 90;
break;
case 3: //180度回転(↓)
$degrees = 180;
break;
case 6: //右に270度回転(←)
$degrees = 270;
break;
case 2: //反転 (↑)
$mode = IMG_FLIP_HORIZONTAL;
break;
case 7: //反転して右90度(→)
$degrees = 90;
$mode = IMG_FLIP_HORIZONTAL;
break;
case 4: //反転して180度なんだけど縦反転と同じ(↓)
$mode = IMG_FLIP_VERTICAL;
break;
case 5: //反転して270度(←)
$degrees = 270;
$mode = IMG_FLIP_HORIZONTAL;
break;
}
//反転(2,7,4,5)
if (isset($mode)) {
$image = imageflip($image, $mode);
}
//回転(8,3,6,7,5)
if ($degrees > 0) {
$image = imagerotate($image, $degrees, 0);
}
//保存
ImageJPEG($image, $filename);
//メモリ解放
imagedestroy($image);