博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP生成缩略图,控制图片质量,支持.png .jpg .gif
阅读量:5843 次
发布时间:2019-06-18

本文共 5450 字,大约阅读时间需要 18 分钟。

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);

 

转载于:https://www.cnblogs.com/yhdsir/p/5181822.html

你可能感兴趣的文章
Java设计模式之策略设计模式
查看>>
javascript获取时间差
查看>>
Angular2中的路由(简单总结)
查看>>
CodeForces - 630C Lucky Numbers
查看>>
用VC和MinGW导出dll的def和lib(a)文件
查看>>
Repeater片段
查看>>
原型模式
查看>>
基于http协议的api接口对于客户端的身份认证方式以及安全措施[转]
查看>>
SQL Server 2008如何导出带数据的脚本文件
查看>>
残差网络
查看>>
CentOS 7.0下使用yum安装MySQL
查看>>
Debian 9.6.0 + OpenMediaVault 4.x : U盘作系统盘时遇到的问题
查看>>
算法导论 第三部分——基本数据结构——第14章:数据结构的扩张
查看>>
安装MySql出现Error Nr.1045的解决办法
查看>>
Python中如何把一个UTC时间转换为本地时间
查看>>
vue的配置环境篇
查看>>
skynet源码阅读<5>--协程调度模型
查看>>
堆和栈的区别
查看>>
【Alpha】开发日志Day8-0719
查看>>
[环境搭建]SDN网络感知服务与最短路径应用
查看>>