php高清晰度无损图片压缩功能的实现代码


Posted in PHP onDecember 09, 2018

 经常会用到把上传的大图片压缩,特别是体积,在微信等APP应用上,也默认都是有压缩的,那么,怎么样对图片大幅度压缩却仍能保持较高的清晰度呢?

 压缩通常是有按比例缩放,和指定宽度压缩的,效果很不错,一个数码相机拍的4M图片,压缩后保持了较高的清晰度和原图宽高值,只有700K。

下面是代码(有两个文件,imgcompress.class.php 类,及compress.php)

compress.php

<?php
 require_once 'imgcompress.class.php';
 $source = 'test.png';//原图文件名
 $dst_img = 'test_.png';//保存图片的文件名
 $percent = ; #原图压缩,不缩放,但体积大大降低
 $image = (new imgcompress($source,$percent))->compressImg($dst_img);

imgcompress.class.php

  

<?php
  /**
  * 图片压缩类:通过缩放来压缩。
  * 如果要保持源图比例,把参数$percent保持为即可。
  * 即使原比例压缩,也可大幅度缩小。数码相机M图片。也可以缩为KB左右。如果缩小比例,则体积会更小。
  *
  * 结果:可保存、可直接显示。
  */
 class imgcompress{
   private $src;
   private $image;
   private $imageinfo;
   private $percent = .;
   /**
    * 图片压缩
    * @param $src 源图
    * @param float $percent 压缩比例
    */
   public function __construct($src, $percent=)
   {
     $this->src = $src;
     $this->percent = $percent;
   }
   /** 高清压缩图片
    * @param string $saveName 提供图片名(可不带扩展名,用源图扩展名)用于保存。或不提供文件名直接显示
    */
   public function compressImg($saveName='')
   {
     $this->_openImage();
     if(!empty($saveName)) $this->_saveImage($saveName); //保存
     else $this->_showImage();
   }
   /**
    * 内部:打开图片
    */
   private function _openImage()
   {
     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();
   }
   /**
    * 内部:操作图片
    */
   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,,,,,$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 、可指定字符串不带后缀的名称,使用源图扩展名 。、直接指定目标图片名带扩展名。
    */
   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);
   }
 }

 使用之后个人感觉 $percent 设置为0.5 左右就不错了,压缩后的图片与原图质量基本一样。

总结

以上所述是小编给大家介绍的php高清晰度无损图片压缩功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
数据库的日期格式转换
Oct 09 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
php中常用的预定义变量小结
May 09 PHP
PHP实现的进度条效果详解
May 03 PHP
微信红包随机生成算法php版
Jul 21 PHP
PHP sleep()函数, usleep()函数
Aug 25 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 PHP
Linux平台php命令行程序处理管道数据的方法
Nov 10 PHP
PHP实现百度人脸识别
May 06 PHP
安装docker和docker-compose实例详解
Jul 30 PHP
PHP使用PDO 连接与连接管理操作实例分析
Apr 21 PHP
PHP聊天室简单实现方法详解
Dec 08 #PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 #PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 #PHP
Laravel框架定时任务2种实现方式示例
Dec 08 #PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 #PHP
thinkPHP框架实现的简单计算器示例
Dec 07 #PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 #PHP
You might like
php将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
详解python调度框架APScheduler使用
2017/03/28 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
户外拓展活动方案
2014/02/11 职场文书
办公室主任个人总结
2015/02/28 职场文书
转正申请报告格式
2015/05/15 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python