zoukankan      html  css  js  c++  java
  • PHP不改变图片长宽只改变图片体积大小的压缩方法

    现在基本上很多网站都有图片管理,包括企业站也是,很多图片为了保证质量可能需要高清,但是图片太大的话,对于服务器也是个压力,每次加载页面的时候光页面图片就得好长时间,影响用户体验。

    当然,如果有钱你可以

    1.cdn静态资源包

    2.oss管理文件资源,不一定是图片,也可以是文件哦

    3.搭建自己的文件服务器,图片当然可以了

    不过以上好是好,不过都得花钱,我感觉还是从根本上解决比较好,来吧,那我们就上代码把

    <?php
    
    /**
     * 图片压缩类:通过缩放来压缩。
     * 如果要保持源图比例,把参数$percent保持为1即可。
     * 即使原比例压缩,也可大幅度缩小。数码相机4M图片。也可以缩为700KB左右。如果缩小比例,则体积会更小。
     *
     * 结果:可保存、可直接显示。
     */
    class imgcompress{
        private $srcurlurl;
        private $image;
        private $imageinfo;
        private $percent = 0.5;
        /**
         * 图片压缩
         * @param $srcurl 源图
         * @param float $percent  压缩比例
         */
        public function __construct($srcurl, $percent=1)
        {
            $this->src = $srcurl;
            $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,0,0,0,0,$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  1、可指定字符串不带后缀的名称,使用源图扩展名 。2、直接指定目标图片名带扩展名。
         */
        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);
        }
    }
    $source =  '1.jpg';//原图片名称
    $dst_img = 'text.png';//压缩后图片的名称
    $percent = 1;  #原图压缩,不缩放,但体积大大降低
    $image = (new imgcompress($source,$percent))->compressImg($dst_img);
    $image = (new imgcompress($source,$percent))->compressImg($dst_img);  新图片名字叫什么名字自己定哦,哈哈 ,不会的再来找我

    这是一个图片类,把类引入你的文件,最后只需要在需要的地方调用这个类里的方法就可以了

  • 相关阅读:
    正经学C#_循环[do while,while,for]:[c#入门经典]
    Vs 控件错位 右侧资源管理器文件夹点击也不管用,显示异常
    asp.net core 获取当前请求的url
    在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be
    用orchard core和asp.net core 3.0 快速搭建博客,解决iis 部署https无法登录后台问题
    System.Data.Entity.Core.EntityCommandExecution The data reader is incompatible with the specified
    初探Java设计模式3:行为型模式(策略,观察者等)
    MySQL教程77-CROSS JOIN 交叉连接
    MySQL教程76-HAVING 过滤分组
    MySQL教程75-使用GROUP BY分组查询
  • 原文地址:https://www.cnblogs.com/HoverM/p/10086657.html
Copyright © 2011-2022 走看看