<?php
/**
* 上传图片压缩旋转
*/
class ImgCompress
{
private $src;
private $image;
private $imageinfo;
private $percent = 1;
/**
* 图片压缩
* @param $src 源图
* @param float $percent 压缩比例
*/
public function __construct($src, $percent = 1) {
$this->src = $src;
$this->percent = $percent;
}
/** 高清压缩图片
* @param string $saveName 提供图片名(可不带扩展名,用源图扩展名)用于保存。或不提供文件名直接显示
*/
public function compressImg($saveName = '') {
$this->_openImage($saveName);
}
/**
* 内部:打开图片
*/
private function _openImage($saveName) {
$exif = exif_read_data($this->src);
list($width, $height, $type, $attr) = getimagesize($this->src);
$this->imageinfo = array(
'width' => $width,
'height' => $height,
'type' => image_type_to_extension($type, false),
'attr' => $attr
);
$fun = "imagecreatefrom" . $this->imageinfo['type'];
$this->image = $fun($this->src);
$this->_thumpImage();
$this->_saveImage($saveName);
$image = imagecreatefromstring(file_get_contents($saveName));
//如果上传的图片被旋转,将它反向旋转回来
if (!empty($exif['Orientation'])) {
switch ($exif['Orientation']) {
case 8:
$image=imagerotate($image, 90, 0);
break;
case 3:
$image=imagerotate($image, 180, 0);
break;
case 6:
$image=imagerotate($image, -90, 0);
break;
}
imagejpeg($image, $saveName);
imagedestroy($image);
}
}
/**
* 内部:操作图片
*/
private function _thumpImage() {
$new_width = $this->imageinfo['width'] * $this->percent;
$new_height = $this->imageinfo['height'] * $this->percent;
$image_thump = imagecreatetruecolor($new_width, $new_height);
//将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度
imagecopyresampled($image_thump, $this->image, 0, 0, 0, 0, $new_width, $new_height, $this->imageinfo['width'], $this->imageinfo['height']);
imagedestroy($this->image);
$this->image = $image_thump;
}
/**
* 输出图片:保存图片则用saveImage()
*/
private function _showImage() {
header('Content-Type: image/' . $this->imageinfo['type']);
$funcs = "image" . $this->imageinfo['type'];
$funcs($this->image);
}
/**
* 保存图片到硬盘:
* @param string $dstImgName 1、可指定字符串不带后缀的名称,使用源图扩展名 。2、直接指定目标图片名带扩展名。
*/
private function _saveImage($dstImgName) {
if (empty($dstImgName)) return false;
$allowImgs = ['.jpg', '.jpeg', '.png', '.bmp', '.wbmp', '.gif']; //如果目标图片名有后缀就用目标图片扩展名 后缀,如果没有,则用源图的扩展名
$dstExt = strrchr($dstImgName, ".");
$sourseExt = strrchr($this->src, ".");
if (!empty($dstExt)) $dstExt = strtolower($dstExt);
if (!empty($sourseExt)) $sourseExt = strtolower($sourseExt);
//有指定目标名扩展名
if (!empty($dstExt) && in_array($dstExt, $allowImgs)) {
$dstName = $dstImgName;
} elseif (!empty($sourseExt) && in_array($sourseExt, $allowImgs)) {
$dstName = $dstImgName . $sourseExt;
} else {
$dstName = $dstImgName . $this->imageinfo['type'];
}
$funcs = "image" . $this->imageinfo['type'];
$funcs($this->image, $dstName);
}
/**
* 销毁图片
*/
public function __destruct() {
imagedestroy($this->image);
}
}
//使用
public function upload(){
vendor('ImgCompress');
$imgCompress = new \imgCompress($_FILES['file']['tmp_name'], 1);
$saveName = './data/upload/default/' . time() . getRandChar(4) . '.jpg';
$imgCompress->compressImg($saveName);
}