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实现将GB编码转换为UTF8
Nov 25 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
Mar 06 PHP
php 将excel导入mysql
Nov 09 PHP
PHP 工厂模式使用方法
May 18 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
ThinkPHP在新浪SAE平台的部署实例
Oct 31 PHP
CodeIgniter删除和设置Cookie的方法
Apr 07 PHP
php实现的验证码文件类实例
Jun 18 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 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下载文件的函数实例代码
2016/05/18 PHP
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
跟老齐学Python之总结参数的传递
2014/10/10 Python
在Python的循环体中使用else语句的方法
2015/03/30 Python
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
Python3.5装饰器原理及应用实例详解
2019/04/30 Python
python文本数据处理学习笔记详解
2019/06/17 Python
python生成大写32位uuid代码
2020/03/03 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
python压包的概念及实例详解
2021/02/17 Python
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
介绍一下如何优化MySql
2016/12/20 面试题
Java语言程序设计测试题选择题部分
2014/04/03 面试题
小学生自我评价范例
2013/09/24 职场文书
工业学校毕业生自荐书
2014/01/03 职场文书
给实习单位的感谢信
2014/02/01 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
介绍长城的导游词
2015/01/30 职场文书
商务代表岗位职责
2015/02/15 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
当幸福来敲门观后感
2015/06/01 职场文书