• 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,
                                     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

  • 相关阅读:
    Linux命令:head
    Linux命令:less
    分布式锁的实现(java)
    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。(转载)
    SpringBoot实现热加载方式
    报表设计细节
    Pentaho Report Designer 数据大于某值显示红色
    Centos7更改yum源与更新系统
    Centos7安装配置NFS服务和挂载
    centos7上搭建ftp服务器(亲测可用)
  • 原文地址:https://www.cnblogs.com/lizhao123/p/9928387.html
Copyright © 2020-2023  润新知