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 相关文章推荐
用PHP读取RSS feed的代码
Aug 01 PHP
swfupload 多文件上传实现代码
Aug 27 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
Mar 19 PHP
详解php中反射的应用
Mar 15 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
May 13 PHP
PHP针对多用户实现更换头像功能
Sep 04 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
php连接mysql数据库最简单的实现方法
Sep 24 PHP
laravel validate 设置为中文的例子(验证提示为中文)
Sep 29 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 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 导出Excel示例分享
2014/08/18 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
php将12小时制转换成24小时制的方法
2015/03/31 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
比较搞笑的js陷阱题
2010/02/07 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
Python import与from import使用及区别介绍
2018/09/06 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
法定代表人授权委托书
2014/04/04 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2015年清明节活动总结
2015/02/09 职场文书
西游记读书笔记
2015/06/25 职场文书
2015年高中生国庆节演讲稿
2015/07/30 职场文书
导游词之舟山普陀山
2019/11/06 职场文书
SSM VUE Axios详解
2021/10/05 Vue.js
python编程项目中线上问题排查与解决
2021/11/01 Python
Java 在线考试云平台的实现
2021/11/23 Java/Android
python+opencv实现目标跟踪过程
2022/06/21 Python