PHPで画像を劣化なしでリサイズする関数!PNG、GIFの透過もOK!
PHPで画像のリサイズ(サイズ変更)をする場合、画像の劣化が気になります。
そこで、画像の劣化をできるだけ抑えて、PNG、GIFの透過部分もきちんと反映される関数を作りました。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>