namespace common\components; class ResizeImageHelper { public $type;//图片类型 public $width;//实际宽度 public $height;//实际高度 public $resize_width;//改变后的宽度 public $resize_height;//改变后的高度 public $cut;//是否裁图 public $srcimg;//源图象 public $dstimg;//目标图象地址 public $im;//临时创建的图象 public $quality;//图片质量 public $img_array = array('jpg', 'png', 'gif'); /** * 生成保持原图纵横比的缩略图,支持.png .jpg .gif * 缩略图类型统一为.png格式 * $img 原图像文件名称 * $wid 缩略图宽 * $hei 缩略图高 * $c 是否剪裁 * $dstpath 缩略图文件名称,为空覆盖原图像文件 * $quality 质量最大100 * @return bool */ public function createThumbnail($img, $wid, $hei, $c, $dstpath, $quality = 100) { $this->srcimg = $img; $this->resize_width = $wid; $this->resize_height = $hei; $this->cut = $c; $this->quality = $quality; //$this->type=strtolower(substr(strrchr($this->srcimg,'.'),1));//图片的类型 $this->type = $this->checkFileType($this->srcimg);//更为严格的检测图片类型 if (!in_array($this->type, $this->img_array)) { return ''; } $this->initi_img();//初始化图象 $this->dst_img($dstpath);//目标图象地址 $this->width = imagesx($this->im); $this->height = imagesy($this->im); $this->newimg();//生成图象 ImageDestroy($this->im); return true; } private function newimg() { $resize_ratio = ($this->resize_width) / ($this->resize_height);//改变后的图象的比例 $ratio = ($this->width) / ($this->height);//实际图象的比例 if (($this->cut) == '1') {//裁图 if (function_exists('imagepng') && (str_replace('.', '', PHP_VERSION) >= 512)) {//针对php版本大于5.12参数变化后的处理情况 $quality = 9; } if ($ratio >= $resize_ratio) {//高度优先 $newimg = imagecreatetruecolor($this->resize_width, $this->resize_height); imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, (($this->height) * $resize_ratio), $this->height); imagejpeg($newimg, $this->dstimg, $this->quality); } if ($ratio < $resize_ratio) {//宽度优先 $newimg = imagecreatetruecolor($this->resize_width, $this->resize_height); imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, $this->width, (($this->width) / $resize_ratio)); imagejpeg($newimg, $this->dstimg, $this->quality); } } else {//不裁图 if ($ratio >= $resize_ratio) { $newimg = imagecreatetruecolor($this->resize_width, ($this->resize_width) / $ratio); imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, ($this->resize_width) / $ratio, $this->width, $this->height); imagejpeg($newimg, $this->dstimg, $this->quality); } if ($ratio < $resize_ratio) { $newimg = imagecreatetruecolor(($this->resize_height) * $ratio, $this->resize_height); imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, ($this->resize_height) * $ratio, $this->resize_height, $this->width, $this->height); imagejpeg($newimg, $this->dstimg, $this->quality); } } } private function initi_img() {//初始化图象 if ($this->type == 'jpg') { $this->im = imagecreatefromjpeg($this->srcimg); } if ($this->type == 'gif') { $this->im = imagecreatefromgif($this->srcimg); } if ($this->type == 'png') { $this->im = imagecreatefrompng($this->srcimg); } } private function dst_img($dstpath) {//图象目标地址 $full_length = strlen($this->srcimg); $type_length = strlen($this->type); $name_length = $full_length - $type_length; $name = substr($this->srcimg, 0, $name_length - 1); $this->dstimg = $dstpath; //echo $this->dstimg; } //读取文件前几个字节 判断文件类型 private function checkFileType($filename) { $file = fopen($filename, 'rb'); $bin = fread($file, 2); //只读2字节 fclose($file); $strInfo = @unpack("c2chars", $bin); $typeCode = intval($strInfo['chars1'] . $strInfo['chars2']); switch ($typeCode) { case 7790: $fileType = 'exe'; break; case 7784: $fileType = 'midi'; break; case 8297: $fileType = 'rar'; break; case 255216: $fileType = 'jpg'; break; case 7173: $fileType = 'gif'; break; case 6677: $fileType = 'bmp'; break; case 13780: $fileType = 'png'; break; default: $fileType = 'unknown' . $typeCode; break; } if ($strInfo['chars1'] == '-1' && $strInfo['chars2'] == '-40') { return 'jpg'; } if ($strInfo['chars1'] == '-119' && $strInfo['chars2'] == '80') { return 'png'; } return $fileType; } }
调用示例
$resizeimage = new ResizeImageHelper(); $resizeimage->CreateThumbnail('path/../1.png', 1440,400, 1, 'path/../2.png', 80);