画像のリサイズ付アップロード
アップロード処理の時にリサイズを行う場面が結構あったのでココで紹介してみます。アップロード処理サンプル
GDのバージョンによって以下を変更ください。
ImageCreateTrueColor()
ImageCreate()
ImageCopyResampled()
ImageCopyResized()
アップロード画像のリサイズクラス
/** * アップロード画像のリサイズ * * @author 高橋 裕志郎 <yujiro@rakuto.net> * @package RKT_upimage * @access public * @version 1.1 */ class RKT_upimage { /** * ファイルの種類 * @var string */ var $mime_type; /** * 一時保存ファイル名 * @var string */ var $tmp_name; /** * ファイルサイズ * @var integer */ var $file_size; /** * fileタイプのinputフォーム名 * @var string */ var $upload_name; /** * コンストラクタ * * @access public * @param string $upload_name fileタイプのinputフォーム名 * @param integer $max_size ファイルの最大サイズ */ function RKT_upimage($upload_name="userFile") { $this->tmp_name = ""; $this->file_size = 0; $this->upload_name = $upload_name; } /** * アップロードされた情報をメンバ変数へセットする * * @access public * @return boolean 成功時真 */ function setUploadInfo() { if (!isSet($_FILES[$this->upload_name])) { return false; } $this->mime_type = $_FILES[$this->upload_name]['type']; $this->tmp_name = $_FILES[$this->upload_name]['tmp_name']; $this->file_size = $_FILES[$this->upload_name]['size']; /* ファイルの種類が画像か判定 */ if (!preg_match("/image/i", $this->mime_type)){ return false; } return true; } /** * アップされた画像ファイルをコピーする * * @access public * @param string $filename コピーファイル名 * @param integer $mod ファイルモード * @return boolean 成功時真 */ function saveUpfile($filename,$mod=0755) { if ($this->tmp_name == "none" || $this->tmp_name == ""){ return false; } if (!copy($this->tmp_name, $filename)){ if (!unlink($filename)){ echo "ERROR : empty [".$filename."]<br>"; } return false; } // if (!copy($this->tmp_name, $filename)) chmod($filename, $mod); $org_size= getImageSize($filename); return array('width'=>$org_size[0],'height'=>$org_size[1]); } /** * 対象画像ファイルのリサイズ値を取得 * * @access public * @param string $filename 対象ファイル名 * @param integer $width 幅の最大値 * @param integer $height 高さの最大値 * @return array リサイズした幅と高さ */ function getResize($filename,$width,$height) { $org_size = getImageSize($filename); $w_scale = $width/$org_size[0]; $h_scale = $height/$org_size[1]; /* 倍率の決定 */ $scale = ($w_scale < $h_scale)?$w_scale:$h_scale; /* 縮小のみは以下を実行 */ $scale = ($scale >= 1.0)?1:$scale; return array( intval($org_size[0] * $scale), intval($org_size[1] * $scale), $org_size[0], $org_size[1] ); } /** * アップされた画像ファイルをリサイズする * * @access public * @param string $filename リサイズファイル名 * @param integer $width リサイズ後の幅 * @param integer $height リサイズ後の高さ * @param integer $mod ファイルモード * @return boolean 成功時真 */ function saveResize($filename,$width,$height,$mod=0755) { if (preg_match("/jpeg/i", $this->mime_type)){ $function_image_create = 'ImageCreateFromJpeg'; $function_image_new = 'ImageJpeg'; } elseif (preg_match("/png/i", $this->mime_type)) { $function_image_create = 'ImageCreateFromGif'; $function_image_new = 'ImagePNG'; } elseif (preg_match("/gif/i", $this->mime_type)) { $function_image_create = 'ImageCreateFromGif'; $function_image_new = 'ImageGif'; } list($rsz_width,$rsz_height,$org_width,$org_height) = $this->getResize($this->tmp_name,$width,$height); $rcs_resize = ImageCreateTrueColor($rsz_width,$rsz_height); $rcs_origin = @$function_image_create($this->tmp_name); ImageCopyResampled($rcs_resize, $rcs_origin, 0, 0, 0, 0, $rsz_width,$rsz_height, $org_width,$org_height); @$function_image_new($rcs_resize, $filename); ImageDestroy($rcs_origin); ImageDestroy($rcs_resize); return array('width'=>$rsz_width,'height'=>$rsz_height); } } // RKT_upimage
実行ファイル
include_once 'rkt_upimage.php'; /* 一覧用画像 */ $objres = new RKT_upimage('image'); if ($objres->setUploadInfo()){ $objres->saveUpfile('test.gif'); $objres->saveResize('tests.gif',80,80); echo "保存"; } <html lang="ja"> <head> <title>リサイズ</title> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> <form name="insert" enctype="multipart/form-data" method="post" action=" echo $_SERVER['PHP_SELF'];" style="margin:0px;"> <input type="file" name="image" size="30"><br> <input type="submit"> </form> </body> </html>
