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(2)
Oct 09 PHP
PHP5中的时间相差8小时的解决办法
Mar 28 PHP
php中的注释、变量、数组、常量、函数应用介绍
Nov 16 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
CI框架中site_url()和base_url()的区别
Jan 07 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
PHP中文竖排转换实现方法
Oct 23 PHP
PhpStorm配置Xdebug调试的方法步骤
Feb 02 PHP
掌握PHP垃圾回收机制详解
Mar 13 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 PHP
php实例化对象的实例方法
Nov 17 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
最省空间的计数器
2006/10/09 PHP
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
Javascript 继承实现例子
2009/08/12 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
微信小程序实现简单input正则表达式验证功能示例
2017/11/30 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
Python新手学习装饰器
2020/06/04 Python
Python扫描端口的实现
2021/01/25 Python
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
党员四风自我剖析材料
2014/10/07 职场文书
护士求职自荐信范文
2015/03/04 职场文书
爱心捐助活动总结
2015/05/09 职场文书
2016公司年会主持词
2015/07/01 职场文书
初中语文教学反思范文
2016/03/03 职场文书