php 将url网络图片的压缩,使用 base64 进行转码存储、base64转图片压缩在转base64

整体思路先讲一下,把网络图片下载到本地,然后进行压缩,在进行base64位转码。

首先1:

//下载图片保存到本地
    public static function curl_file_get_contents($url,$path){
        $hander = curl_init();
        $fp = fopen($path,'wb');
        curl_setopt($hander,CURLOPT_URL,$url);
        curl_setopt($hander,CURLOPT_FILE,$fp);
        curl_setopt($hander,CURLOPT_HEADER,0);
        curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($hander,CURLOPT_TIMEOUT,60);
        curl_exec($hander);
        curl_close($hander);
        fclose($fp);
        Return $path;
    }

2:

//对本地图片进行base64位转码
  public static function base64EncodeImage ($imageFile) {
        $base64Image='';
        $imageInfo = getimagesize($imageFile);
        $imageData = fread(fopen($imageFile, 'r'), filesize($imageFile));
        $base64Image = 'data:' . $imageInfo['mime'] . ';base64,' .chunk_split(base64_encode($imageData));
        return $base64Image;
    }

3:

创建一个新的图片处理类

	namespace App\Http\tool; 
    class ImgCompress
    {
        private $src;
        private $image;
        private $imageinfo;
        private $percent = 0.5;

    /*
     * 图片压缩
     * @param $src 源图
     * @param float $percent 压缩比例
     */
    public function __construct($src, $percent = 0.8)
    {
        $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, 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);
    }

4:

调用 对应方法

			$res=Helper::curl_file_get_contents($url,'test1.jpg');   //$url 为图片路径
            $dst_img = 'text.jpg';//压缩后图片的名称
            (new ImgCompress($res,self::PERCENT))->compressImg($dst_img);  //这里的self::PERCENT  是定义的常亮 即 压缩比例  默认不传为 0.5,数据在 0-1 之间
            $base64=Helper::base64EncodeImage($dst_img);
            unlink($res);  //删除本地图片
            unlink($dst_img); //删除本地图片
            return $base64;
以上是将网络图片的url压缩,再使用 base64 进行转码存储


接下来 base64转图片在压缩在转base64,大同小异

添加一个方法

//base64位 转图片
    public static function base64ToImage($base64_image_content){
     // 正则匹配 img类型
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
            $type = $result[2];
            $new_file = "test.{$type}";
            if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
                return $new_file;
            }else{
                return false;
            }
        }
    }

然后调方法:

		$img=Helper::base64ToImage($base64);  //传入你的base64 编码
        $dst_img = 'text.jpg';//压缩后图片的名称
        (new ImgCompress($img,self::PERCENT))->compressImg($dst_img); //这里的self::PERCENT  是定义的常量 即 压缩比例  默认不传为 0.5,数据在 0-1 之间
        $newBase64=Helper::base64EncodeImage($dst_img);
        unlink($img);  //删除本地图片
        unlink($dst_img); //删除本地图片
        return $newBase64;
因为项目不需要存储图片在本地 ,数据库中存base64编码,所以最后都做了删除操作,可按照自身需求进行优化调整代码,可以通用于各种框架 laravel、tp…

很多都是前人踩过坑,借鉴了他们的代码(找不到原作者,如有侵权,请联系删除)

你可能感兴趣的:(php 将url网络图片的压缩,使用 base64 进行转码存储、base64转图片压缩在转base64)