プログラミングで飯を食え。腕をあげたきゃ備忘録!

PHP、JavaScript、HTML5、CSS3などWEB系言語を中心に基本テク、備忘録をまとめます。Android、Iphoneアプリ開発についても!

PHPで画像を劣化なしでリサイズする関数!PNG、GIFの透過もOK!

サクウェブTVはコチラ↓↓↓
サクウェブTV

PHPで画像のリサイズ(サイズ変更)をする場合、画像の劣化が気になります。

そこで、画像の劣化をできるだけ抑えて、PNGGIFの透過部分もきちんと反映される関数を作りました。PHPファイルに直接記述して使用しても、別ファイルでrequire_once()するなどしても、cakePHPでComponentsとして利用してもOKです。

以下、関数です。

	function resizeImage($image,$new_width,$dir = "."){
		list($width,$height,$type) = getimagesize($image["tmp_name"]);
		$new_height = round($height*$new_width/$width);
		$emp_img = imagecreatetruecolor($new_width,$new_height);
		switch($type){
			case IMAGETYPE_JPEG:
				$new_image = imagecreatefromjpeg($image["tmp_name"]);
				break;
			case IMAGETYPE_GIF:
				$new_image = imagecreatefromgif($image["tmp_name"]);
				break;
			case IMAGETYPE_PNG:
				imagealphablending($emp_img, false);
				imagesavealpha($emp_img, true);
				$new_image = imagecreatefrompng($image["tmp_name"]);
				break;
		}
		imagecopyresampled($emp_img,$new_image,0,0,0,0,$new_width,$new_height,$width,$height);
		$date = date("YmdHis");
		switch($type){
			case IMAGETYPE_JPEG:
				imagejpeg($emp_img,$dir."/".$date.".jpg");
				break;
			case IMAGETYPE_GIF:
				$bgcolor = imagecolorallocatealpha($new_image,0,0,0,127);
				imagefill($emp_img, 0, 0, $bgcolor);
				imagecolortransparent($emp_img,$bgcolor);
				imagegif($emp_img,$dir."/".$date.".gif");
				break;
			case IMAGETYPE_PNG:
				imagepng($emp_img,$dir."/".$date.".png");
				break;
		}
		imagedestroy($emp_img);
		imagedestroy($new_image);
	}

第一引数は、<input type="file" name="img" />でアップした$_FILES["img"]などです。

第二引数は、リサイズ後の横幅です。

第三引数は、リサイズ後の画像を保存するディレクトリのパスです。(最後に/は不要)

第三引数を指定しない場合は、この関数を使用したPHPファイルと同じディレクトリに保存されます。

 

※リサイズ後は自動的に縦横比率は維持されます。

 

すぐに試せるようにサンプルのPHPファイルのソースを載せておきます。

<?php
	if(isset($_POST["create"])){
		resizeImage($_FILES["img"],(int)$_POST["width"]);
	}
	
	function resizeImage($image,$new_width,$dir = "."){
		list($width,$height,$type) = getimagesize($image["tmp_name"]);
		$new_height = round($height*$new_width/$width);
		$emp_img = imagecreatetruecolor($new_width,$new_height);
		switch($type){
			case IMAGETYPE_JPEG:
				$new_image = imagecreatefromjpeg($image["tmp_name"]);
				break;
			case IMAGETYPE_GIF:
				$new_image = imagecreatefromgif($image["tmp_name"]);
				break;
			case IMAGETYPE_PNG:
				imagealphablending($emp_img, false);
				imagesavealpha($emp_img, true);
				$new_image = imagecreatefrompng($image["tmp_name"]);
				break;
		}
		imagecopyresampled($emp_img,$new_image,0,0,0,0,$new_width,$new_height,$width,$height);
		$date = date("YmdHis");
		switch($type){
			case IMAGETYPE_JPEG:
				imagejpeg($emp_img,$dir."/".$date.".jpg");
				break;
			case IMAGETYPE_GIF:
				$bgcolor = imagecolorallocatealpha($new_image,0,0,0,127);
				imagefill($emp_img, 0, 0, $bgcolor);
				imagecolortransparent($emp_img,$bgcolor);
				imagegif($emp_img,$dir."/".$date.".gif");
				break;
			case IMAGETYPE_PNG:
				imagepng($emp_img,$dir."/".$date.".png");
				break;
		}
		imagedestroy($emp_img);
		imagedestroy($new_image);
	}
?>
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="utf-8">
		<title>Resize Test</title>
	</head>
	<body>
		<form action="index.php" method="post" enctype="multipart/form-data">
			<input type="file" name="img" /><br>
			<input type="text" name="width" value="300"/><br>
			<input type="submit" value="送信" name="create"/>
		</form>
	</body>
</html>