类文件
<?php
$image = new Thumb();
$path = $image->makeThumb('./upload/bg1.jpg', 200,200);
/**
* @Purpose: 图像缩放
*/
class Thumb
{
// 保存图像的路径
protected $path;
// 是否随机名字
protected $isRandName;
// 保存图像的类型
protected $type;
function __construct($path = './image/', $isRandName = true, $type = 'png')
{
$this->path = $path;
$this->isRandName = $isRandName;
$this->type = $type;
}
// $image 需要缩放的图片 $width缩放后的宽度 $height缩放后的高度 $prefix前缀
public function makeThumb($image, $width, $height, $prefix='thumb_')
{
if(!file_exists($image)){
echo "文件无效";
exit;
}
// 1. 得到图片原来的宽高
$info = self::getImageInfo($image);
// 2. 缩放后合适的宽高
$size = $this->getNewSize($width, $height, $info);
// 3. 打开图片资源
$imageRes = self::openAnyImage($image);
// 4. 进行缩放
$newRes = $this->kidOfImage($imageRes, $size, $info);
// 5. 保存图片
$newName = $this->createNewName($image, $prefix);
$newPath = rtrim($this->path, '/').'/'.$newName;
$this->saveImage($newRes, $newPath);
// 6. 销毁图像资源
imagedestroy($imageRes);
imagedestroy($newRes);
}
// 根据图片路径得到图片信息(宽, 高, mime)
static function getImageInfo($imagePath)
{
$info = getimagesize($imagePath);
$data['width'] = $info[0];
$data['height'] = $info[1];
$data['mime'] = $info['mime'];
return $data;
}
// 根据图片类型打开图片
static function openAnyImage($imagePath)
{
// 图像的mime
$mime = self::getImageInfo($imagePath)['mime'];
switch ($mime) {
case 'image/png':
$image = imagecreatefrompng($imagePath);
break;
case 'image/gif':
$image = imagecreatefromgif($imagePath);
break;
case 'image/jpeg':
$image = imagecreatefromjpeg($imagePath);
break;
case 'image/wbmp':
$image = imagecreatefromwbmp($imagePath);
break;
}
return $image;
}
// 创建新名字
protected function createNewName($imagePath, $prefix)
{
if($this->isRandName){
$name = $prefix . uniqid().'.'.$this->type;
}else{
$name = $prefix . pathinfo($imagePath)['filename'].'.'.$this->type;
}
return $name;
}
// 保存图片
protected function saveImage($imageRes, $newPath)
{
if(!$this->check()){
die('目录不存在');
}
$func = 'image'.$this->type;
$func($imageRes, $newPath);
}
// 检测创建文件夹, 检测文件是否可写
protected function check()
{
// 文件夹不存在或不是目录,创建
if(!file_exists($this->path) || !is_dir($this->path)){
return mkdir($this->path, 0777, true);
}
// 判断文件是否可写
if(!is_writeable($this->path)){
return chmod($this->path, 0777);
}
return true;
}
// 处理透明色
protected function kidOfImage($srcImg, $size, $imgInfo)
{
// 传入新的尺寸,创建一个指定尺寸的图片
$newImg = imagecreatetruecolor($size['old_w'], $size['old_h']);
// 定义透明色
$otsc = imagecolortransparent($srcImg);
if($otsc >= 0){
// 取得透明色
$transparentcolor = imagecolorsforindex($srcImg, $otsc);
// 创建透明色
$newtransparentcolor = imagecolorallocate($newImg, $transparentcolor['red'], $transparentcolor['green'], $transparentcolor['blue']);
}else{
//将黑色作为透明色。创建图像后第一次分配颜色时默认背景是黑色
$newtransparentcolor = imagecolorallocate($newImg, 0, 0, 0);
}
// 背景填充透明
imagefill($newImg, 0, 0, $newtransparentcolor);
imagecolortransparent($newImg, $newtransparentcolor);
imagecopyresampled($newImg, $srcImg, $size['x'], $size['y'], 0, 0, $size['new_w'], $size['new_h'], $imgInfo['width'], $imgInfo['height']);
return $newImg;
}
// 计算宽度和高度 最终缩放宽度 最终高度 原始宽高
protected function getNewSize($width, $height, $imgInfo)
{
$size['old_w'] = $width;
$size['old_h'] = $height;
$scaleWidth = $width / $imgInfo['width'];
$scaleHeight = $height / $imgInfo['height'];
$scaleFinal = min($scaleWidth, $scaleHeight);
$size['new_w'] = round($imgInfo['width'] * $scaleFinal);
$size['new_h'] = round($imgInfo['height'] * $scaleFinal);
if($scaleWidth < $scaleHeight){
$size['x'] = 0;
$size['y'] = round(abs($size['new_h'] - $height) / 2);
}else{
$size['y'] = 0;
$size['x'] = round(abs($size['new_w'] - $width) / 2);
}
return $size;
}
}