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压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
PHP计数器的实现代码
Jun 08 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
php使用$_POST或$_SESSION[]向js函数传参
Sep 16 PHP
php计划任务之ignore_user_abort函数实现方法
Jan 08 PHP
php中动态调用函数的方法
Mar 16 PHP
php邮件发送的两种方式
Apr 28 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
May 13 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 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
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
关于php fread()使用技巧
2010/01/22 PHP
使用PHP提取视频网站页面中的FLASH地址的代码
2010/04/17 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
php邮件发送的两种方式
2020/04/28 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
使用PHP开发留言板功能
2019/11/19 PHP
js 中 document.createEvent的用法
2010/08/29 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Pandas的Apply函数具体使用
2020/07/21 Python
python用Configobj模块读取配置文件
2020/09/26 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
《英英学古诗》教学反思
2014/04/11 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
检讨书怎么写
2015/05/07 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电