ci框架经canvas压缩图片后经base64上传

2 篇文章 0 订阅

前端HTML代码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>上传图片</title>
	<script type="text/javascript" src="./js/jquery-1.11.3.min.js"></script>
</head>
<body>
	<form method="post" enctype='multipart/form-data'>
		<input type="file" id="mypic" name="mypic" accept="image/*">
		<input type="submit" id="tanchu">
	</form>
<script type="text/javascript">
	$(function(){
		var input = document.getElementById("mypic"); 
		//$('#mypic').addEventListener('change',readFile,false);//此处不能用id选择器添加事件监听
		input.addEventListener('change',readFile,false);
		
		function readFile(){
	        var file = this.files[0];
	        //这里我们判断下类型如果不是图片就返回 去掉就可以上传任意文件   
	        if(!/image\/\w+/.test(file.type)){
	            alert("请确保文件为图像类型"); 
	            return false; 
	        }
	        
	        var reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onload = function () {
                compressImg(reader.result, function (res) {
                    $.post(
                    	'base64.php',//跳转的url
                    	{'IMAGE':res},
                    	function(data){
                    		//进行返回数据的处理
                    	},
                    	'json'
                    )
                });
            };
	    }

	    //压缩图片
        function compressImg(soureImg, callback) {
            self = this;
            var after = getByteLen(soureImg) / 1024;
            console.log('压缩前==>' + getByteLen(soureImg) / 1024 + 'kb');
            console.log('压缩中...');
            console.time('用时');
            // 参数处理
            var baseImg = soureImg;
            // 创建img
            var oImg = new Image();
            oImg.src = baseImg;
            // 处理图片大小,宽度大于 1920则压缩大小为一半
            var Iwidth;
            var Iheight;
            oImg.addEventListener('load', function (ev) {
                Iwidth = ev.target.width;
                Iheight = ev.target.height;
                if (Number(Iwidth) > 1920) {
                    Iwidth = Iwidth / 2;
                    Iheight = Iheight / 2;
                }
                // 创建canvas
                var canvas = document.createElement('canvas');
                var cxt = canvas.getContext("2d");
                canvas.width = Iwidth;
                canvas.height = Iheight;
                cxt.drawImage(oImg, 0, 0, Iwidth, Iheight);
                var canvasBase64 = canvas.toDataURL("image/jpeg", 0.5);
                callback(canvasBase64);
                // 垃圾回收
                oImg = null;
                canvas = null;
                console.timeEnd('用时');
                console.log('压缩后==>' + getByteLen(canvasBase64) / 1024 + 'kb');
                console.log('转换率==>' + getByteLen(canvasBase64) / 1024 / after * 100 + '%');
            }); 
        }

        function getByteLen(str) {
            var l = str.length;
            var n = l;
            for (var i = 0; i < l; i++) {
                if (str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255) {
                    n++
                }
            }
            return n
        }
	})
</script>
</body>
</html>


后台php处理代码


<?php
	header('Content-type:text/html;charset="utf-8"');
	/*echo '<pre>';
	print_r($_POST['IMAGE']);exit;*/
	//利用这样的方式也能达到刷选出来数据的目的
	/*$img = trim($_POST['IMAGE']);
    $jpg = explode('/', explode(';', $img)[0])[1];
    $start=strpos($img,',');
    $img= substr($img,$start+1);*/
    



	$base64_img = trim($_POST['IMAGE']);
	preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_img, $result);
	$type = $result[2];
    if(in_array($type,array('pjpeg','jpeg','jpg','gif','bmp','png'))){
    	$path = './images';
    	if(!file_exists($path)){
    		mkdir($path,0777,true);
    	}
    	$file = uniqid();//基于以微秒计的当前时间,生成一个唯一的ID
    	$fileName = $path .'/'. $file. '.' . $type;
    	$img = str_replace($result[1], '', $base64_img);
    	$img = str_replace(' ', '+', $img);//这一步要注意替换,要不然会出现乱码
    	$data = base64_decode($img);
    	$success = file_put_contents($fileName, $data);//至此,图片已经上传成功,后续判断根据自己需求来更改
    	if($success){
	        $s_config['image_library']  = 'gd2';
	        $s_config['source_image']   = $path . '/' . $file . '.' .$type;
	        $s_config['new_image']      = $path . '/s_' . $file . '.' .$type;

	        $fileName_s = date('Ymd') . '/s_' . $file . '.' .$type;

	        $s_config['create_thumb']   = true;
	        $s_config['thumb_marker']   = '';
	        $s_config['maintain_ratio'] = true;
	        $s_config['quality']        = 50;
	        $s_config['width']          = 300;
	        $s_config['height']         = 200;
	        $this->load->library('image_lib', $s_config);
	        $this->image_lib->resize();
	        echo json_encode(['data' => ['yt' =>$this->config->config['resources_img_url'] . $fileName, 'slt' =>  $this->config->config['resources_img_url'] . $fileName_s]]);
	    }else{
	        echo json_encode(array('code'=>101,'msg'=>'上传失败'));
	    }
    }else{
    	echo json_encode(array('code'=>101,'msg'=>'图片类型不符合'));
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值