123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Administrator
- * Date: 2016/1/11
- * Time: 14:34
- */
- namespace common\library;
- /**
- * 缩略图生成类,使用示例:
- **/
- class ImageResize
- {
- private $localimage;//原图路径
- private $remoteimage;//缩略图保存路径
- private $localinfo;//原图属性
- private $error;
- function resize($localimg, $remoteimg, $x, $y)
- {
- //检测是否支持gd图像处理
- if (!$this->_checkenv()) {
- return false;
- }
- $this->localimage = $localimg;
- $this->remoteimage = $remoteimg;
- $this->localinfo = getimagesize($this->localimage); //获取本地图像的信息
- return $this->_resize($x, $y);
- }
- function cut_resize($localimg, $remoteimg, $x, $y){
- //检测是否支持gd图像处理
- if (!$this->_checkenv()) {
- return false;
- }
- $this->localimage = $localimg;
- $this->remoteimage = $remoteimg;
- $this->localinfo = getimagesize($this->localimage); //获取本地图像的信息
- return $this->_resizeAndCut($x,$y);
- }
- /**
- * 检测当前环境是否支持GD
- * @return bool
- */
- private function _checkenv()
- {
- if (!function_exists('gd_info')) {
- $this->error[] = "当前环境不支持GD图像处理,请先安装GD库并开启PHP相关扩展";
- return false;
- }
- return true;
- }
- /**
- * @param $x
- * @param $y
- * @return bool
- */
- private function _resize($x, $y)
- {
- if (!$this->localinfo) {
- $this->error[] = "本地图像文件不存在";
- return false;
- }
- //创建图像句柄
- $im = @$this->_create($this->localinfo[2]);
- if (!$im) {
- $this->error[] = "当前GD库不支持图像类型:{$this->localinfo['mime']}";
- return false;
- }
- $dstsize = $this->_dstsize($x, $y);
- $dstim = @imagecreatetruecolor($dstsize["width"], $dstsize["height"]);
- if($this->localinfo[2] == 3)
- $whitecolor = @imagecolorallocatealpha($dstim, 255, 255, 255, 127);
- else
- $whitecolor = @imagecolorallocatealpha($dstim, 0, 0, 0, 127);
- imagefill($dstim, 0, 0, $whitecolor);
- $re = @imagecopyresampled($dstim, $im, 0, 0, 0, 0, $dstsize["width"], $dstsize["height"], $this->localinfo[0], $this->localinfo[1]);
- if (!$re) {
- $this->error[] = "图像重新采样失败";
- return false;
- }
- if (!imagejpeg($dstim, $this->remoteimage)) {
- if (!imagepng($dstim, $this->remoteimage)) {
- if (!imagegif($dstim, $this->remoteimage)) {
- $this->error[] = "保存缩略图到{$this->remoteimage}失败,请检查gd环境是否正常和缩略图文件夹的写入权限。";
- return false;
- }
- }
- }
- $this->error[] = "success";
- return true;
- }
- /**
- * 修改图片尺寸并裁剪为正方形
- * @param $x
- * @param $y
- * @return bool
- */
- private function _resizeAndCut($x,$y){
- if (!$this->localinfo) {
- $this->error[] = "本地图像文件不存在";
- return false;
- }
- //创建图像句柄
- $im = @$this->_create($this->localinfo[2]);
- if (!$im) {
- $this->error[] = "当前GD库不支持图像类型:{$this->localinfo['mime']}";
- return false;
- }
- $dstsize = $this->_dstsize($x, $y);
- $dstposition = $this->_initPosition($this->localinfo[0],$this->localinfo[1]);
- $dstminsize = min($dstsize);
- $srcminsize = min($this->localinfo[0],$this->localinfo[1]);
- $dstim = @imagecreatetruecolor($dstminsize, $dstminsize);
- $whitecolor = @imagecolorallocatealpha($dstim, 0, 0, 0, 127);
- imagefill($dstim, 0, 0, $whitecolor);
- $re = @imagecopyresampled($dstim, $im, 0, 0, $dstposition['x'], $dstposition['y'], $dstminsize, $dstminsize, $srcminsize, $srcminsize);
- if (!$re) {
- $this->error[] = "图像重新采样失败";
- return false;
- }
- if (!imagejpeg($dstim, $this->remoteimage)) {
- if (!imagepng($dstim, $this->remoteimage)) {
- if (!imagegif($dstim, $this->remoteimage)) {
- $this->error[] = "保存缩略图到{$this->remoteimage}失败,请检查gd环境是否正常和缩略图文件夹的写入权限。";
- return false;
- }
- }
- }
- $this->error[] = "success";
- return true;
- }
- /**
- *
- * 根据本地图片类型,创建图片资源
- * @param $code 图像类型代码
- * @return resource/boolean 成功则返回resourse失败则返回false
- */
- private function _create($code)
- {
- $src = $this->localimage;
- switch ($code) {
- case 1:
- return imagecreatefromgif($src);
- break;
- case 2:
- return imagecreatefromjpeg($src);
- break;
- case 3:
- return imagecreatefrompng($src);
- break;
- default:
- return false;
- break;
- }
- }
- /**
- * 计算长宽
- * @param $x
- * @param $y
- */
- private function _dstsize($x, $y)
- {
- list($srcwidth, $srcheight) = $this->localinfo;
- if (($srcwidth / $srcheight) < ($x / $y)) {
- $x = floor($y * $srcwidth / $srcheight);
- } else {
- $y = floor($x * $srcheight / $srcwidth);
- }
- $dstsize["width"] = $x;
- $dstsize["height"] = $y;
- return $dstsize;
- }
- /**
- ** 获取最后一条错误信息
- * * return string
- **/
- function GetLastError()
- {
- return array_pop($this->error);
- }
- /**
- * * 获取所有错误信息
- * * return array
- * */
- function GetAllError()
- {
- return $this->error;
- }
- function test(){
- }
- /**
- * 计算初始坐标
- * @return array
- */
- function _initPosition($x,$y,$init = ''){
- $local = ['x'=>'','y'=>''];
- if(bccomp($x,$y) == -1){
- $local['x'] = '0';
- $local['y'] = bcsub($y,$x,2)/2;
- }else{
- $local['y'] = '0';
- $local['x'] = bcsub($x,$y,2)/2;
- }
- return $local;
- }
- }
|