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

原文地址:https://www.cnblogs.com/lizhao123/p/9928387.html

时间: 2024-11-05 13:34:35

uni-app图片压缩转base64位 利用递归来实现多张图片压缩的相关文章

使用javascript把图片转成base64位编码,然后传送到服务端(ajax调用的接口基于drupa7)

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script src='http://code.jquery.com/jquery-1.9.1.min.js'></script> <script src='jquery.base64.js'><

mui开发app之js将base64转图片文件

之前我已经做过一个利用cropper裁剪并且制作头像的功能.如何在mui app中实现相册或相机获取图片后裁剪做头像请看另一篇博客:mui开发app之cropper裁剪后上传头像的实现 但是当时裁剪后图片是保存为base64格式的,这是h5 canvas建议使用的图片传输方式. 很多时候很多api,比如mui中第三方插件map中有一个setIcon传入的必须是本地的图片文件地址,目前的第三方地图系统任然不支持base64的标注图,所以折腾了一晚之后终于在native.js中找到了将base64转

按比例压缩图片和图片转换成BASE64

通常会需要将突破转换为字符串的操作,贴此详例,仅供参考和积累 #region 按比例压缩图片和图片转换成BASE64 /// <summary> /// 按照比例缩小图片 /// </summary> /// <param name="srcImage">要缩小的图片</param> /// <param name="percent">缩小比例</param> /// <returns&g

java将图片输出base64位码显示

注意需要过滤:\r \n数据 jkd1.7的 import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; /** * 网络图片转换Base64的方法 * * @param netImagePath      */ public static String NetImageToBase64(String netImagePath) { final ByteArrayOutputStream data = new ByteArrayOut

造轮子:C#中将图片转化成base64字符串

厂址:http://www.cnblogs.com/yunfeifei/p/4165351.html 1.在C#中将图片转化成base64字符串: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConvertImgToBase64 { class Program { static void Main(string[]

html5将图片转换成base64的实例代码

这篇文章给大家介绍了如何利用html5将图片转换成base64,文中通过示例代码介绍的很详细,有需要的朋友们可以参考借鉴. base64编码介绍base64是一种网络上常用的8bit字节代码的编码方式,base64可以用于http环境下传递较长的标识信息,同时可以放在url当中使用,因为base64不惧可读性,所以具有一定的加密功能. 为什么要把图片转换成base64编码?将图片转换成base64代码可以减少http请求,因为图片可以以字符编码的形式直接传递到客户端,而文件形式都需要进行http

图片处理之 Base64

网页上的图片资源如果采用 http 形式的 url 的话都会额外发送一次请求,网页发送的 http 请求次数越多,会造成页面加载速度越慢.而采用Base64格式的编码,将图片转化为字符串后,图片文件会随着 html 元素一并加载,这样就可以减少 http 请求的次数,对于网页优化是一种比较好的手段. 当我们将一个只有几KB的图片转化为Base64格式编码,根据 Base64 的编码原理,大小比原文件大小大 1/3.如果将其写在一个 CSS 文件中,这样一个 CSS 文件的大小会剧增,造成代码可读

CVE-2014-4113 Win8.1 64位利用(2014.11)

CVE-2014-4113 Win8.1 64位利用 关于漏洞成因的分析已经很多了,但是样本针对的是win8之前的利用,国外研究员Moritz Jodeit对Win8.1上的利用做了研究,并给出了思路.根据其思路,对Win8.1利用做尝试. Win8.1中调用xxxMNFindWindowFromPoint函数后,对得到的窗口对象tagWnd结构的处理代码存在差异: Win8.1从[tag+90h]获得的值会经过检查,确定其小于7才会进行下一步操作,r10+rax*8为一个内核地址,所以这是我们

js绝对地址图片转换成base64的方法

//将图片转换成base64 function getBase64Image(url, callback){ var canvas = document.createElement('canvas'), ctx = canvas.getContext('2d'), img = new Image(); //为了解决跨域,可以直接img.crossOrigin=''就能解决图片跨域问题 img.crossOrigin = 'xes'; img.onload = function(){ canvas