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随机数生成代码与使用实例分析
Apr 08 PHP
PHP登录环节防止sql注入的方法浅析
Jun 30 PHP
php中最简单的字符串匹配算法
Dec 16 PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 PHP
php简单判断两个字符串是否相等的方法
Jul 13 PHP
详解php中反射的应用
Mar 15 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 PHP
Laravel关系模型指定条件查询方法
Oct 10 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类
2008/04/09 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
监督检查工作方案
2014/05/28 职场文书
升国旗演讲稿
2014/09/05 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技