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 相关文章推荐
网站当前的在线人数
Oct 09 PHP
php htmlentities和htmlspecialchars 的区别
Aug 18 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
PHP中使用数组实现堆栈数据结构的代码
Feb 05 PHP
php二分查找二种实现示例
Mar 12 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 PHP
解决laravel 5.1报错:No supported encrypter found的办法
Jun 07 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
php实现微信小程序授权登录功能(实现流程)
Nov 13 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 无限级缓存的类的扩展
2009/03/16 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
json原理分析及实例介绍
2012/11/29 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
python基础练习之几个简单的游戏
2017/11/10 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
Python从列表推导到zip()函数的5种技巧总结
2019/10/23 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
网络技术专业求职信
2014/05/02 职场文书
国际贸易求职信
2014/07/05 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
限期整改通知书
2015/04/22 职场文书
Django基础CBV装饰器和中间件
2022/03/22 Python