outputImage($p, $w, $h, $z); if($ret === false) { header("Content-Type: text/html; charset=utf-8"); echo $obj_thumb->getErrorResult(); } /** * サムネイル出力クラス * */ class thumb { var $error = ""; var $default = 680; /** * コンストラクタ(PHP5対応) * */ function __construct() { } /* * コンストラクタ */ function thumb() { } function outputImage($path, $maxwidth, $maxheight, $z) { if(!isset($path)) { $this->error = "画像へのパスが設定されていません"; return false; } if(!file_exists($path)) { $this->error = "ファイルが見つかりません"; return false; } $size = getimagesize($path); // if($size == false) { // $this->error = "ファイルの形式が不正です"; // return false; // } //echo $size; if($maxwidth == 0) { $maxwidth = $this->default; } if($maxheight == 0) { $maxheight = $this->default; } if($size) $re_size = $this->_getThumbSize($path, $maxwidth, $maxheight, $z); // リサイズの必要がない場合は,そのまま出力 if($size && $re_size[2] == 0) { if($size[2] =="1"){ header("Content-type: image/gif"); }else if($size[2]=="2"){ header("Content-type: image/jpeg"); }else if($size[2]=="3"){ header("Content-type: image/png"); } echo readfile($path); break; } $imagecreate = function_exists("imagecreatetruecolor") ? "imagecreatetruecolor" : "imagecreate"; $imageresize = function_exists("imagecopyresampled") ? "imagecopyresampled" : "imagecopyresized"; if($z==1){ if($size[0]>$size[1]){ $sx = ($size[0]-$size[1])/2; $sy = 0; $src_w = $size[1]; $src_h = $size[1]; }else{ $sx = 0; $sy = ($size[1]-$size[0])/2; $src_w = $size[0]; $src_h = $size[0]; } }else{ $sx = 0; $sy = 0; $src_w = $size[0]; $src_h = $size[1]; } $convert = "/usr/bin/convert"; switch($size[2]): case "1": // gif形式 $option = "-geometry ".$re_size[0]."x".$re_size[1]; header ("Content-type: image/gif"); passthru("$convert $option $path gif:-"); /* if(function_exists("imagecreatefromgif")) { $src_im = imagecreatefromgif($path); $dst_im = $imagecreate($re_size[0], $re_size[1]); $transparent = imagecolorat($src_im, $dummy_x, $dummy_y); $colorstotal = imagecolorstotal ($src_im); if(function_exists("imagecreatetruecolor")) { $dst_im = imagecreatetruecolor($re_size[0], $re_size[1]); $tc = imagecolorsforindex($src_im, $transparent); imagefill ($dst_im, 0, 0, imagecolorallocate ($dst_im, $tc["red"], $tc["green"], $tc["blue"])); imagetruecolortopalette ($dst_im, false, $colorstotal); imagecolortransparent ($dst_im, imagecolorclosest ($dst_im, $tc["red"], $tc["green"], $tc["blue"])); imagecopyresampled ($dst_im, $src_im, 0, 0, 0, 0, $re_size[0], $re_size[1], $size[0], $size[1]); } else { $dst_im = imagecreate($re_size[0], $re_size[1]); if (0 <= $transparent && $transparent < $colorstotal) { imagepalettecopy ($dst_im, $src_im); imagefill ($dst_im, 0, 0, $transparent); imagecolortransparent ($dst_im, $transparent); } imageresize($dst_im, $src_im, 0, 0, 0, 0, $re_size[0], $re_size[1], $size[0], $size[1]); } if(function_exists("imagegif")) { header("content-Type: image/gif"); imagegif($dst_im); imagedestroy($src_im); imagedestroy($dst_im); } else { header("content-Type: image/png"); imagepng($dst_im); imagedestroy($src_im); imagedestroy($dst_im); } } else { // サムネイル作成不可の場合(旧バージョン対策) $dst_im = imageCreate($re_size[0], $re_size[1]); imageColorAllocate($dst_im, 255, 255, 214); //背景色 // 枠線と文字色の設定 $black = imageColorAllocate($dst_im, 0, 0, 0); $red = imageColorAllocate($dst_im, 255, 0, 0); imagestring($dst_im, 5, 10, 10, "GIF $size[0]x$size[1]", $red); imageRectangle ($dst_im, 0, 0, ($re_size[0]-1), ($re_size[1]-1), $black); header("content-Type: image/png"); imagepng($dst_im); imagedestroy($src_im); imagedestroy($dst_im); } */ case "2": // jpg形式 // exec($convert.' '.$path.'" -crop '$src_w.'x'.$src_h.'+'.$sx.'+'.$sy.' "'.$tmp.'"'); // header ("Content-type: image/jpg"); // passthru($convert.' '.$path.'" -crop '$src_w.'x'.$src_h.'+'.$sx.'+'.$sy.'"'); // passthru($convert.' '.$path.'" -crop 400x400 jpg:-"'); // passthru($tmp); // exec($convert.' '.$path.'" -resize '.$dx.'x'.$dy.' "'.$tmp.'"'); // if($re_size[0]<400){ $src_im = imageCreateFromJpeg($path); $dst_im = $imagecreate($re_size[0], $re_size[1]); ImageCopyResampled( $dst_im, $src_im, 0, 0, $sx, $sy, $re_size[0], $re_size[1], $src_w, $src_h); header("content-Type: image/jpeg"); imageJpeg($dst_im, NULL, 100); imagedestroy($src_im); imagedestroy($dst_im); // }else{ // $option = "-crop ".$src_w."x".$src_h."+".$sx."+".$sy; // header("content-Type: image/jpeg"); // $option2 = "-quality 90 -resize " .$re_size[0]."x".$re_size[1]; // passthru("/usr/bin/convert $path $option2 jpg:-"); // } break; // png形式 case "3": $src_im = imagecreatefrompng($path); $colortransparent = imagecolortransparent($src_im); if ($colortransparent > -1) { $dst_im = $imagecreate($re_size[0], $re_size[1]); imagepalettecopy($dst_im, $src_im); imagefill($dst_im, 0, 0, $colortransparent); imagecolortransparent($dst_im, $colortransparent); $imageresize($dst_im,$src_im, 0, 0, 0, 0, $re_size[0], $re_size[1], $size[0], $size[1]); } else { $dst_im = $imagecreate($re_size[0], $re_size[1]); $imageresize($dst_im,$src_im, 0, 0, 0, 0, $re_size[0], $re_size[1], $size[0], $size[1]); imagetruecolortopalette($dst_im, false, imagecolorstotal($src_im)); } header("content-Type: image/png"); imagepng($dst_im); imagedestroy($src_im); imagedestroy($dst_im); break; default: $option = "-geometry 140x200 -quality 90"; header ("Content-type: image/jpeg"); // echo $path; passthru("$convert $option $path jpg:-"); //$this->error = "画像の形式が不正です"; //return false; break; endswitch; } /** * $maxsize を長辺の長さとした場合のサイズを戻す * * @param string $path 画像のパス * @param int $maxwidth 横の長さ * @param int $maxheight 縦の長さ * @return mixed array(横幅, 縦幅, リサイズ要フラグ) */ function _getThumbSize($path, $maxwidth, $maxheight, $z) { // $maxsizeの値チェック if($maxwidth == 0 && $maxheight == 0) { return false; } // 画像の存在チェック if(!file_exists($path)) { return false; } // 画像サイズ取得 $size = getimagesize($path); $wratio = 1; $hratio = 1; // 縮小比率計算 if($maxwidth > 0) { $wratio = $maxwidth / $size[0]; } if($maxheight > 0) { $hratio = $maxheight / $size[1]; } // 拡大になる場合は原寸 if($wratio > 1 && $hratio > 1) { return false; } // 縮小率が高い方に合わせる if($z == 1){ $height = $maxheight; $width = $maxwidth; }else{ if($wratio > $hratio) { $height = $maxheight; $width = round($size[0] * $hratio, 0); }else { $width = $maxwidth; $height = round($size[1] * $wratio, 0); } } return array($width, $height, 1); } /** * エラーメッセージを戻す * * @return string */ function getErrorResult() { return $this->error; } } ?>