使用类静态方法,实现批量缩略图,单个缩略图。 依赖gd库 ?php/** * 图片工具类,支持缩略图, 获取类型等 * pre * ImgUtil::thumbnailTo("src.jpg",100,100,"src_100.jpg"); * ImgUtil::thumbnailBat("src.jpg",arr
依赖gd库
<?php /** * 图片工具类,支持缩略图, 获取类型等 * <pre> * ImgUtil::thumbnailTo("src.jpg",100,100,"src_100.jpg"); * ImgUtil::thumbnailBat("src.jpg",array( * array("width"=>50,"height"=>50,"file"=>"src_50.jpg"), * array("width"=>100,"height"=>100,"file"=>"src_100.jpg"), * array("width"=>180,"height"=>180,"file"=>"src_180.jpg"), * )); * </pre> */ class ImgUtil { /** * 生成缩略图 * @param string $src 源文件路径 * @param int $width 缩略图宽度 * @param int $height 缩略图高度 * @param string $toFile 目标文件地址 */ public static function thumbnailTo($src, $width, $height, $toFile){ return self::resizeTo($src, $width, $height, $toFile, true, true); } /** * 批量缩略图 * @param string $src 源文件路径 * @param array $list array(array("width"=>"宽","height"=>"高","file"=>"存储文件路径")) */ public static function thumbnailBat($src, $list){ $img = new ImgUtil($src); $srcImg = $img->resource; $srcWidth = imagesx($srcImg); $srcHeight = imagesy($srcImg); foreach($list as $k=>$info){ $toWidth = $info["width"]; $toHeight = $info["height"]; self::scale($toWidth, $toHeight, $srcWidth, $srcHeight, true, true); $retImg = self::scaleToImg($srcImg, $toWidth, $toHeight, $srcWidth, $srcHeight); $toFile = $info["file"]; self::saveTo($retImg, $toFile, $img->type); imagedestroy($retImg); } return true; } /** * 拉伸图片到目标大小 * @param string $src 源文件路径 * @param int $width 目标尺寸 * @param int $height 目标尺寸 * @param string $toFile 缩放后存储文件 */ public static function resizeForceTo($src, $width, $height, $toFile){ return self::resizeTo($src, $width, $height, $toFile, false, false); } /** * @param string $src 目录文件 * @param int $width 目标尺寸 * @param int $height 目标尺寸 * @param string $toFile 缩放后存储文件 * @param boolean $ratio 保持比例 * @param boolean $thumbnail 如果为false支持等比放大 true则只支持等比从大到小 */ public static function resizeTo($src, $width, $height, $toFile, $ratio=TRUE, $thumbnail=FALSE){ $img = new ImgUtil($src); $srcImg = $img->resource; $srcWidth = imagesx($srcImg); $srcHeight = imagesy($srcImg); self::scale($width, $height, $srcWidth, $srcHeight, $ratio, $thumbnail); $retImg = self::scaleToImg($srcImg, $width, $height, $srcWidth, $srcHeight); $img->destory(); if(!$toFile || empty($toFile)){ $toFile = $src; } self::saveTo($retImg, $toFile, $img->type); imagedestroy($retImg); return true; } /** * 缩放srcImgResource * @param resource $srcImg ImageResource * @param int $toWidth toWidth * @param int $toHeight toHeight * @param int $srcWidth srcWidth * @param int $srcHeight srcHeight * @return resource ImageResource */ public static function scaleToImg($srcImg,$toWidth,$toHeight,$srcWidth=-1,$srcHeight=-1){ if($srcWidth<0||$srcHeight<0){ $srcWidth = imagesx($srcImg); $srcHeight = imagesy($srcImg); } if(function_exists("imagecopyresampled")){ $toImg = imagecreatetruecolor($toWidth, $toHeight); imagecopyresampled($toImg,$srcImg,0,0,0,0,$toWidth,$toHeight,$srcWidth,$srcHeight); }else{ $toImg = imagecreate($toWidth,$toHeight); imagecopyresized($toImg,$srcImg,0,0,0,0,$toWidth,$toHeight,$srcWidth,$srcHeight); } return $toImg; } /** * 根据是否保持比例是否缩略图,计算缩放后的真实尺寸 * @param int $toWidth toWidth * @param int $toHeight toHeight * @param int $srcWidth srcWidth * @param int $srcHeight srcHeight * @param boolean $ratio 保持比例 * @param boolean $thumbnail 如果为false支持等比放大 true则只支持等比从大到小 */ public static function scale(&$toWidth,&$toHeight,$srcWidth,$srcHeight, $ratio=TRUE, $thumbnail=FALSE){ if($ratio || $thumbnail){ if($thumbnail && ($srcWidth<$toWidth && $srcHeight<$toHeight)){ $toWidth = $srcWidth; $toHeight = $srcHeight; }else{ if (($toWidth/$toHeight) <= ($srcWidth/$srcHeight)){ $toHeight = intval($toWidth * ($srcHeight / $srcWidth)); }else{ $toWidth = intval($toHeight * ($srcWidth / $srcHeight)); } } } } /** * 保存ImageResource到文件 * @param resource $image * @param string $file * @param string $type */ public static function saveTo($image,$file,$type="jpg"){ if($type=="png"){ imagepng($image, $file); }else if($type=="gif"){ $transColor = imagecolorallocatealpha($this->resource, 255, 255, 255, 127); imagecolortransparent($image, $transColor); imagegif($image, $file); }else{ imagejpeg($image, $file, 100); } } public $resource; public $type = null; public function __construct($src){ if(is_string($src)){ if(file_exists($src) && is_readable($src)){ $info = getimagesize($src); if($info){ if ($info[2] == IMAGETYPE_JPEG){ $this->resource = imagecreatefromjpeg($src); $this->type = "jpeg"; }else if($info[2] == IMAGETYPE_PNG){ $this->resource = @imagecreatefrompng($src); $this->type = "png"; }else if($info[2] == IMAGETYPE_GIF){ $this->resource = @imagecreatefromgif($src); $this->type = "gif"; }else if($info[2] == IMAGETYPE_BMP){ $this->resource = @imagecreatefromwbmp($src); $this->type = "bmp"; } } }else{ $this->resource = @imagecreatefromstring($src); } }else if(is_array($src) && count($src)>1){ if(isset($src[0])){ $this->resource = imagecreatetruecolor($src[0], $src[1]); }else{ $this->resource = imagecreatetruecolor($src["width"], $src["height"]); } }else if(is_resource($src)){ $this->resource = $src; }else if(get_class($src)==get_class($this)){ $this->resource = $src->resource; $this->type = $src->type; } if($this->resource==null){ throw new Exception("ArgumentError:".$src); } } public function width() { return imagesx($this->resource); } public function height() { return imagesy($this->resource); } public function save($file,$type=null){ if($type==null){ $type = $this->type; } self::saveTo($this->resource, $file, $type); } public function destory(){ imagedestroy($this->resource); } } ?>