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 相关文章推荐
操作Oracle的php类
Oct 09 PHP
php 5.3.5安装memcache注意事项小结
Apr 12 PHP
php学习笔记之面向对象编程
Dec 29 PHP
zend Framework中的Layout(模块化得布局)详解
Jun 28 PHP
查找php配置文件php.ini所在路径的二种方法
May 26 PHP
ThinkPHP采用实现三级循环代码实例
Jul 18 PHP
PHP也能干大事之PHP中的编码解码详解
Apr 20 PHP
php显示时间常用方法小结
Jun 05 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
php求斐波那契数的两种实现方式【递归与递推】
Sep 09 PHP
PHP用swoole+websocket和redis实现web一对一聊天
Nov 05 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 记录访客的浏览信息方法
2018/01/29 PHP
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
javascript concat数组累加 示例
2009/09/03 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
JS &amp; JQuery 动态添加 select option
2016/06/08 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
django 消息框架 message使用详解
2019/07/22 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
介绍java中初始化块的使用
2012/09/11 面试题
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
中秋手机店促销方案
2014/06/16 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL