ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Tp5 图片压缩(简单易懂版)

2021-06-13 16:34:11  阅读:348  来源: 互联网

标签:info src imageinfo 压缩 percent Tp5 易懂 type image


目前有点小bug,一些被压缩图片会无法压缩, 比例建议不更改使用0.5

 

首先在extend目录下创建Qrcode文件夹,创建类Compress.php

namespace Qrcode;

use think\Controller;

class Compress extends Controller
{
    private $src;
    private $image;
    private $imageinfo;
    private $percent;

    /*
    param    $src源图路径
    param    $percent压缩比例
    */
    public function __construct($src,$percent=1)
    {
        $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);
        //将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度

        /*  处理缩放png图透明背景变黑色问题 start  */
        $color=imagecolorallocate($image_thump,255,255,255);
        imagecolortransparent($image_thump,$color);
        imagefill($image_thump,0,0,$color);
        /*  处理缩放png图透明背景变黑色问题 end  */

        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);
    }
}

 

测试类使用

public function test()
    {
        $file = request()->file('file');

        $info = $file->validate(['size' => 20480000, 'ext' => 'jpg,png,gif,jpeg'])->move('./UploadFiles');//最大为2m

        if ($info) {
            $image = $info->getSaveName();
            // $_SERVER['DOCUMENT_ROOT'] 为 /www/wwwroot/integral/public
            $source = $_SERVER['DOCUMENT_ROOT'] . '/UploadFiles/' . $image;
            //$dst_img = $_SERVER['DOCUMENT_ROOT'] . '/UploadFiles_s/' . $image;
            $percent = 0.5;  #缩放比例
            (new Compress($source, $percent))->compressImg($source);  //压缩
            // 成功上传后 获取上传信息
            //$file_info = $info->getInfo();
            $response = [
                'code' => 200,
                'msg' => 'upload success',
                //'oldName' => $info->getFilename(),
                'fileSuffixes' => $info->getExtension(),
                'saveName' => $info->getSaveName(),
                //'file_info' => $file_info
            ];
        } else {
            $response = [
                'code' => 400,
                'msg' => $file->getError()
            ];
        }
        return json($response);  //返回数据
    }

 

效果:

 

 

 

 

 修改前的原文链接:https://www.cnblogs.com/Jessie-candy/p/13737908.html

 

原文可能不够详细 现在详细化一点了,希望大家能够一起学习进步!

 

标签:info,src,imageinfo,压缩,percent,Tp5,易懂,type,image
来源: https://www.cnblogs.com/jaychou-/p/14880505.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有