Exif 画像の向き 回転/反転による調整
1~8段階のExif Orientationに基づき回転/反転より位置を調整
Exif Orientation
Exif Orientation(画像の向き)が1~8で定義されている。
- 1.
□□■
■■■
■■■ - 2.
■□□
■■■
■■■ - 3.
■■■
■■■
■□□ - 4.
■■■
■■■
□□■ - 5.
□■■
□■■
■■■ - 6.
■■■
□■■
□■■ - 7.
■■■
■■□
■■□ - 8.
■■□
■■□
■■■
1: 通常、 2: 水平反転、 3: 180°回転、 4: 垂直反転、 5: 水平反転、 反時計回りに90°回転(1→2→5) 6: 反時計回りに90°回転 7: 垂直反転後、反時計回りに90°回転(1→4→7) 8: 反時計回りに270°回転
スマートフォンなどで撮影した際に、カメラの向きによって1~8の値が自動付与。 画像のプロパティからはOrientationの確認できない。
PHP
/**
*
* Exif 画像の向き 回転/反転による調整
* @param string $file_name
* @param text $mode
*/
function imageRotation($file_name)
{
// 存在チェック
if (! file_exists($file_name)) {
exit;
}
// EXIFヘッダを読み込み
$exif = exif_read_data($file_name, 'EXIF');
// コンテントタイプ
header('Content-type: image/jpeg');
// 読み込み
$im = imagecreatefromjpeg($file_name);
$degrees = 0;
$mode = '';
switch($exif['Orientation']) {
case 1: // 通常
break;
case 2: // 水平反転
$mode = 'IMG_FLIP_HORIZONTAL';
break;
case 3: // (反時計回りに)180°回転
$degrees = 180;
break;
case 4: // 垂直反転
$mode = 'IMG_FLIP_VERTICAL';
break;
case 5: // 水平反転、 反時計回りに90°回転(反時計回りに270°回転で正常)
$degrees = 270;
$mode = 'IMG_FLIP_HORIZONTAL';
break;
case 6: // 反時計回りに90°回転(反時計回りに270°回転で正常)
$degrees = 270;
break;
case 7: // 垂直反転、 反時計回りに90°回転(反時計回りに270°回転で正常)
$degrees = 270;
$mode = 'IMG_FLIP_VERTICAL';
break;
case 8: // 反時計回りに270°回転(反時計回りに90°回転で正常)
$degrees = 90;
break;
}
// 反転
if (! empty($mode)) {
$im = imageflip($im, $mode);
}
// 回転(反時計回り)
if ($degrees > 0) {
$im = imagerotate($im, $degrees, 0);
}
// 出力
imagejpeg($im);
// メモリの解放
imagedestroy($im);
}
反転時にPHP5.5以上は標準のimageflipを使用。PHP5.4以下はimageflipを使用。