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 spl_autoload_register实现自动加载研究
Dec 06 PHP
php在文件指定行中写入代码的方法
May 23 PHP
php排序算法(冒泡排序,快速排序)
Oct 09 PHP
解析php扩展php_curl.dll不加载的解决方法
Jun 26 PHP
php使用codebase生成随机数
Mar 25 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
php中fgetcsv()函数用法实例
Nov 28 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
PHP依赖注入原理与用法分析
Aug 21 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 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面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP与以太坊交互详解
2018/08/24 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
Python科学计算环境推荐——Anaconda
2014/06/30 Python
python中黄金分割法实现方法
2015/05/06 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
马丁路德金演讲稿
2014/05/19 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
建党伟业电影观后感
2015/06/01 职场文书
聊聊redis-dump工具安装问题
2022/01/18 Redis
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers