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 相关文章推荐
php5数字型字符串加解密代码
Apr 24 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
Feb 10 PHP
php连接数据库代码应用分析
May 29 PHP
PHP连接Access数据库的方法小结
Jun 20 PHP
PHP时间和日期函数详解
May 08 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
php UNIX时间戳用法详解
Feb 16 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
php输出反斜杠的实例方法
Sep 19 PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 PHP
php慢查询日志和错误日志使用详解
Feb 27 PHP
php+laravel 扫码二维码签到功能
May 15 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连mysql和oracle数据库性能比较
2006/10/09 PHP
php使用ICQ网关发送手机短信
2013/10/30 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
页面使用密码保护代码
2013/04/10 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
python3 flask实现文件上传功能
2020/03/20 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
Python文件操作的面试题
2013/06/22 面试题
大学新生军训个人的自我评价
2013/10/03 职场文书
好的演讲稿开场白
2013/12/30 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA