uni-app图片压缩转base64位 利用递归来实现多张图片压缩

Posted 奔跑吧前端(李钊)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uni-app图片压缩转base64位 利用递归来实现多张图片压缩相关的知识,希望对你有一定的参考价值。

//选择图片
chooseImage(){
    let that =this
    uni.chooseImage({
    sizeType: [original,compressed], //可以指定是原图还是压缩图,默认二者都有
    count: 9,//默认9
    success: (rem) => {
    console.log(rem)
    that.tempFilePaths = rem.tempFilePaths;
    //#ifdef MP-WEIXIN
        //图片压缩并转base64
        that.weixin_img(0,rem)
    //#endif
                        
    //#ifdef APP-PLUS
        //图片压缩
        that.app_img(0,rem)    
    //#endif
                        
    }
    })
},
//app压缩图片  用for循环 来处理图片压缩 的问题,原因是 plus.zip.compressImage 方法 是异步执行的,for循环很快, 同时手机可执行的压缩方法有限制:应该是3个吧。超出直接就不执行了。所以 原理就是 在图片压缩成功后 继续 回调 压缩函数。 以到达循环压缩图片的功能。
            app_img(num,rem){
                let that=this
                let index = rem.tempFiles[num].path.lastIndexOf(".");//获取图片地址最后一个点的位置  
                let img_type  = rem.tempFiles[num].path.substring(index+1,rem.tempFiles[num].path.length);//截取图片类型如png jpg
                let img_yuanshi = rem.tempFiles[num].path.substring(0,index);//截取图片原始路径
                let d2 = new Date().getTime(); //时间戳
                //压缩图片
                plus.zip.compressImage(
                    {
                        src:rem.tempFiles[num].path,//你要压缩的图片地址
                        dst:img_yuanshi+d2+.+img_type,//压缩之后的图片地址(注意压缩之后的路径最好和原生路径的位置一样,不然真机上报code-5)
                        quality:10//[10-100]
                    },
                    function(e) {
                        console.log("Compress success!",e.target);
                        //压缩之后路径转base64位的
                        //通过URL参数获取目录对象或文件对象
                        plus.io.resolveLocalFileSystemURL(e.target, function( entry ) {
                            // 可通过entry对象操作test.html文件 
                            entry.file( function(file){//获取文件数据对象
                                var fileReader = new plus.io.FileReader();// 文件系统中的读取文件对象,用于获取文件的内容
                                //alert("getFile:" + JSON.stringify(file));
                                fileReader.readAsDataURL( file ); //以URL编码格式读取文件数据内容
                                fileReader.onloadend = function(evt) {//读取文件成功完成的回调函数
                                    console.log(evt.target.result.split(",")[1])//拿到‘data:image/jpeg;base64,‘后面的
                                    
                                    rem.tempFiles[num].Base64_Path=evt.target.result.split(",")[1]
                                }
                            })
                        })
                        that.materialList = that.materialList.concat(rem.tempFiles[num]);
                        //利用递归循环来实现多张图片压缩
                        if(num==rem.tempFiles.length-1){
                            return
                        }else{
                            that.app_img(num+1,rem)
                        }
                        console.log(end,that.materialList)
                    },function(error) {
                        console.log("Compress error!");
                        console.log(JSON.stringify(error));
                    }    
                );
            },

    //微信压缩
            weixin_img(num,rem){
                let that=this
                wx.getImageInfo({//获取这个图片 图片压缩
                    src: rem.tempFiles[num].path,//需要获取的图片 图片选择不用我说了吧
                    success: function (res) {
                        var ctx = wx.createCanvasContext(attendCanvasId);//使用一个canvas
                        var canvasWidth = res.width//原图宽度 
                        var canvasHeight = res.height;//原图高度
                        var ratio = 2;
                         // 保证宽高均在200以内
                        while (canvasWidth > 200 || canvasHeight > 200){
                            //比例取整
                            canvasWidth = Math.trunc(res.width / ratio)
                            canvasHeight = Math.trunc(res.height / ratio)
                            ratio++;
                        }
                        //绘制新图
                        ctx.drawImage(rem.tempFiles[num].path, 0, 0, canvasWidth, canvasHeight)
                        ctx.draw(false, () => {
                            //获取图像数据, API 1.9.0
                            wx.canvasGetImageData({
                                canvasId: attendCanvasId,
                                x: 0,
                                y: 0,
                                width: canvasWidth,
                                height: canvasHeight,
                                success : (res) => {
                                    let platform = wx.getSystemInfoSync().platform
                                    if (platform == ios) {
                                        // 兼容处理:ios获取的图片上下颠倒
                                        res = that.reverseImgData(res)
                                    }
                                    // 3. png编码
                                    let pngData = upng.encode([res.data.buffer],canvasWidth, canvasHeight)  
                                    // 4. base64编码
                                    let base64 = wx.arrayBufferToBase64(pngData)
                                    // console.log(‘1111‘,‘data:image/jpeg;base64,‘+base64)
                                    rem.tempFiles[num].Base64_Path=base64
                                    that.materialList = that.materialList.concat(rem.tempFiles[num]);
                                    //利用递归循环来实现多张图片压缩
                                    if(num==rem.tempFiles.length-1){
                                        return
                                    }else{
                                        that.weixin_img(num+1,rem)
                                    }
                                    console.log(end,that.materialList)
                                }
                            })
                        })
                    },
                })
                
                
            },
            // 兼容处理:ios获取的图片上下颠倒
            reverseImgData(res) {
                var w = res.width
                var h = res.height
                let con = 0
                for (var i = 0; i < h / 2; i++) {
                    for (var j = 0; j < w * 4; j++) {
                    con = res.data[i * w * 4 + j]
                    res.data[i * w * 4 + j] = res.data[(h - i - 1) * w * 4 + j]
                    res.data[(h - i - 1) * w * 4 + j] = con
                    }
                }
                return res
            }
        }

微信小程序压缩图片需要用到

const upng = require(‘../../static/js/upng.js‘);和pake.min.js去下载两个文件放一起

地址https://github.com/zh8637688/wx-cardscanner/tree/master/cardscanner/upng-js

 



以上是关于uni-app图片压缩转base64位 利用递归来实现多张图片压缩的主要内容,如果未能解决你的问题,请参考以下文章

图片转base64并压缩大小

利用 canvas 实现压缩图片

base64文件转MultipartFile文件

base64位代码转图片文件并保存到文件夹的解决方案

通过 Thumbnails 压缩图片后转 base64

iOS - Base64转图片&&图片转Base64