読者です 読者をやめる 読者になる 読者になる

PSLブログ

ヨシナシゴトヲツヅリマス

スマホでアップロードした画像をphpで向きを補正する

いろいろな記事を調査したが、コードそのままで動くものがなかった…
一番近いのが以下の記事だが、縦長に撮った写真の上下が逆さになってしまった。
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);
}
?>