图片压缩上传

实现图片压缩后上传,判断图片的大小,如果超过多少就等比缩放,然后canvas重新画出来。(这段脚本是参考别人的来写的)
脚本还不够成熟,还需要完善,也请大神看看哪里有问题给点意见,谢谢!(或者如果谁有更好的压缩方式,也请提供一起学习~)
还可以参考:https://blog.youkuaiyun.com/ityang521/article/details/70667037

html代码截图: (看我划的重点即可,其他类名是框架的可以忽略)
在这里插入图片描述
js代码截图:
在这里插入图片描述
附加说明:convertBase64UrlToBlob()方法是将base64编码的图片转换为二进制数据,atob() 对用base-64编码过的字符串进行解码 ,Blob 对象表示一个不可变、原始数据的类文件对象。下面的应用就是:新建了一个文件,赋值给了uploadFile(可以传送给后台)。
即:可以输出base64编码的图片数据,也可以用这个方法输出blob文件对象,然后发送到后台,如果后台不需要blob文件对象,则完全可以去掉该方法。base64编码数据比blob文件要大一些,在小系统中用base64编码数据也ok。
在这里插入图片描述

js代码复制区:

/* 
        * 图片压缩
        * img    原始图片
        * width   压缩后的宽度
        * height  压缩后的高度
        * ratio   压缩比率 
        */
        function compress(img, width, height, ratio) {        
            var canvas, ctx, img64;
            canvas = document.createElement('canvas');        
            canvas.width = width;
            canvas.height = height;
                //创建一个画布
            ctx = canvas.getContext("2d");        
            ctx.drawImage(img, 0, 0, width, height);
            img64 = canvas.toDataURL("image/jpeg", ratio);
            return img64;
        }

        /**  
         * 将以base64的图片url数据转换为Blob  
         * @param urlData  
         *            用url方式表示的base64图片数据  
         */  
        function convertBase64UrlToBlob(urlData){  

            var bytes=window.atob(urlData.split(',')[1]);        //去掉url的头,并转换为byte  

            //处理异常,将ascii码小于0的转换为大于0  
            var ab = new ArrayBuffer(bytes.length);  
            var ia = new Uint8Array(ab);  
            for (var i = 0; i < bytes.length; i++) {  
                ia[i] = bytes.charCodeAt(i);  
            }  
            return new Blob( [ab] , { type : 'image/jpeg'});  
        }  

        var uploadFile = null;

        function AddCallImage() {
            var docObj = document.getElementById("add-call-upfile");
            var imgObjPreview = document.getElementById("add-call-upimg");
            var image = new Image();
            if(docObj.files && docObj.files[0]) {
                image.src =  window.URL.createObjectURL(docObj.files[0]);
                var imgSize=(docObj.files[0]).size/1024;
                if(imgSize>200||image.width>1024||image.height>1024){
                    image.onload = function(){
                        var width = image.width;
                        var height = image.height;
                        var max =  Math.max(width, height);
                        var max_wh = max<1440 && imgSize>500 ? 1024 : 1440; 
                        if(width > height) {
                            if(width > max_wh) {
                                height = Math.round(height *= max_wh / width);
                                width = max_wh;
                            }
                        }else{
                            if(height > max_wh) {
                                width = Math.round(width *= max_wh / height);
                                height = max_wh;
                            }
                        }
                        var img64 = compress(image, width, height, 0.9);
                        imgObjPreview.src = img64;
                        $(imgObjPreview).show();
                        uploadFile = new File([convertBase64UrlToBlob(img64)], docObj.files[0].name, { type : 'image/jpeg'});
                    }
                }else{
                    uploadFile = docObj.files[0];
                    imgObjPreview.src = window.URL.createObjectURL(docObj.files[0]);
                    $(imgObjPreview).show();
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值