1. //选择图片
  2. chooseImage(){
  3. let that =this
  4. uni.chooseImage({
  5. sizeType: ['original','compressed'], //可以指定是原图还是压缩图,默认二者都有
  6. count: ,//默认9
  7. success: (rem) => {
  8. console.log(rem)
  9. that.tempFilePaths = rem.tempFilePaths;
  10. //#ifdef MP-WEIXIN
  11. //图片压缩并转base64
  12. that.weixin_img(,rem)
  13. //#endif
  14.  
  15. //#ifdef APP-PLUS
  16. //图片压缩
  17. that.app_img(,rem)
  18. //#endif
  19.  
  20. }
  21. })
  22. },
  1. //app压缩图片 用for循环 来处理图片压缩 的问题,原因是 plus.zip.compressImage 方法 是异步执行的,for循环很快, 同时手机可执行的压缩方法有限制:应该是3个吧。超出直接就不执行了。所以 原理就是 在图片压缩成功后 继续 回调 压缩函数。 以到达循环压缩图片的功能。
  2. app_img(num,rem){
  3. let that=this
  4. let index = rem.tempFiles[num].path.lastIndexOf(".");//获取图片地址最后一个点的位置
  5. let img_type = rem.tempFiles[num].path.substring(index+,rem.tempFiles[num].path.length);//截取图片类型如png jpg
  6. let img_yuanshi = rem.tempFiles[num].path.substring(,index);//截取图片原始路径
  7. let d2 = new Date().getTime(); //时间戳
  8. //压缩图片
  9. plus.zip.compressImage(
  10. {
  11. src:rem.tempFiles[num].path,//你要压缩的图片地址
  12. dst:img_yuanshi+d2+'.'+img_type,//压缩之后的图片地址(注意压缩之后的路径最好和原生路径的位置一样,不然真机上报code-5)
  13. quality://[10-100]
  14. },
  15. function(e) {
  16. console.log("Compress success!",e.target);
  17. //压缩之后路径转base64位的
  18. //通过URL参数获取目录对象或文件对象
  19. plus.io.resolveLocalFileSystemURL(e.target, function( entry ) {
  20. // 可通过entry对象操作test.html文件
  21. entry.file( function(file){//获取文件数据对象
  22. var fileReader = new plus.io.FileReader();// 文件系统中的读取文件对象,用于获取文件的内容
  23. //alert("getFile:" + JSON.stringify(file));
  24. fileReader.readAsDataURL( file ); //以URL编码格式读取文件数据内容
  25. fileReader.onloadend = function(evt) {//读取文件成功完成的回调函数
  26. console.log(evt.target.result.split(",")[])//拿到'data:image/jpeg;base64,'后面的
  27.  
  28. rem.tempFiles[num].Base64_Path=evt.target.result.split(",")[]
  29. }
  30. })
  31. })
  32. that.materialList = that.materialList.concat(rem.tempFiles[num]);
  33. //利用递归循环来实现多张图片压缩
  34. if(num==rem.tempFiles.length-){
  35. return
  36. }else{
  37. that.app_img(num+,rem)
  38. }
  39. console.log('end',that.materialList)
  40. },function(error) {
  41. console.log("Compress error!");
  42. console.log(JSON.stringify(error));
  43. }
  44. );
  45. },
  1. //微信压缩
  2. weixin_img(num,rem){
  3. let that=this
  4. wx.getImageInfo({//获取这个图片 图片压缩
  5. src: rem.tempFiles[num].path,//需要获取的图片 图片选择不用我说了吧
  6. success: function (res) {
  7. var ctx = wx.createCanvasContext('attendCanvasId');//使用一个canvas
  8. var canvasWidth = res.width//原图宽度 
  9. var canvasHeight = res.height;//原图高度
  10. var ratio = ;
  11. // 保证宽高均在200以内
  12. while (canvasWidth > || canvasHeight > ){
  13. //比例取整
  14. canvasWidth = Math.trunc(res.width / ratio)
  15. canvasHeight = Math.trunc(res.height / ratio)
  16. ratio++;
  17. }
  18. //绘制新图
  19. ctx.drawImage(rem.tempFiles[num].path, , , canvasWidth, canvasHeight)
  20. ctx.draw(false, () => {
  21. //获取图像数据, API 1.9.0
  22. wx.canvasGetImageData({
  23. canvasId: 'attendCanvasId',
  24. x: ,
  25. y: ,
  26. width: canvasWidth,
  27. height: canvasHeight,
  28. success : (res) => {
  29. let platform = wx.getSystemInfoSync().platform
  30. if (platform == 'ios') {
  31. // 兼容处理:ios获取的图片上下颠倒
  32. res = that.reverseImgData(res)
  33. }
  34. // 3. png编码
  35. let pngData = upng.encode([res.data.buffer],canvasWidth, canvasHeight)
  36. // 4. base64编码
  37. let base64 = wx.arrayBufferToBase64(pngData)
  38. // console.log('1111','data:image/jpeg;base64,'+base64)
  39. rem.tempFiles[num].Base64_Path=base64
  40. that.materialList = that.materialList.concat(rem.tempFiles[num]);
  41. //利用递归循环来实现多张图片压缩
  42. if(num==rem.tempFiles.length-){
  43. return
  44. }else{
  45. that.weixin_img(num+,rem)
  46. }
  47. console.log('end',that.materialList)
  48. }
  49. })
  50. })
  51. },
  52. })
  53.  
  54. },
  55. // 兼容处理:ios获取的图片上下颠倒
  56. reverseImgData(res) {
  57. var w = res.width
  58. var h = res.height
  59. let con =
  60. for (var i = ; i < h / ; i++) {
  61. for (var j = ; j < w * ; j++) {
  62. con = res.data[i * w * + j]
  63. res.data[i * w * + j] = res.data[(h - i - ) * w * + j]
  64. res.data[(h - i - ) * w * + j] = con
  65. }
  66. }
  67. return res
  68. }
  69. }

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

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

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

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

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

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. 图片转成base64位 页面中图片展示

    <img src="data:image/gif;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABG ...

  3. Java通过图片url地址获取图片base64位字符串的两种方式

    工作中遇到通过图片的url获取图片base64位的需求.一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥. 之后 ...

  4. js 图片压缩上传(base64位)以及上传类型分类

    一.input file上传类型 1.指明只需要图片 <input type="file" accept='image/*'> 2.指明需要多张图片 <input ...

  5. 图片上传前 压缩,base64图片压缩 Exif.js处理ios拍照倒置等问题

    曾写过在前端把图片按比例压缩不失真上传服务器的前端和后台,可惜没有及时做总结保留代码,只记得js利用了base64位压缩和Exif.js进行图片处理,还有其中让我头疼的ios拍照上传后会倒置等诸多问题 ...

  6. svg转化成canvas以便生成base64位的图片

    很久前写了关于把html转成图片的一个例子,最近有出了新的问题.利用html2canvas.js文件把html转成base64位的图片是没什么问题的,但也不是绝对的,比如这时候不能碰见svg这个鬼,h ...

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

    之前我已经做过一个利用cropper裁剪并且制作头像的功能.如何在mui app中实现相册或相机获取图片后裁剪做头像请看另一篇博客:mui开发app之cropper裁剪后上传头像的实现 但是当时裁剪后 ...

  8. 小程序实现图片上传,预览以及图片base64位处理

    最近一段时间在做小程序项目,第一期功也完工了.需要好好总结一下经验,把项目中遇到的问题好好总结一下,遇到的问题,踩过的坑.今天写一个小程序实现图片上传,预览,以及删除,图片base64位处理.下面就是 ...

  9. 微信小程序开发——base64位图片显示问题

    前言: 目前小程序项目需要后端借口提供验证码图片,后端是以base64位返回的,按照H5的做法,前边拼上 data:image/png;base64, 应该就可以了,关键代码如下: H5: <i ...

随机推荐

  1. 家庭记账本小程序之删(java web基础版四)

    实现删除消费账单 1.main_left.jsp中该部分,调用Servlet中delete方法 2.Servlet中delete方法,调用Dao层list方法,跳转到del.jsp页面 3.Dao层l ...

  2. 【学习总结】GirlsInAI ML-diary day-12-for循环

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day12 认识for循环执行 ps: range()函数 python range() 函数可创建一个整数列表,一般用在 ...

  3. [转帖]ORA-03113解决方法

    ORA-03113解决方法 https://www.cnblogs.com/xwdreamer/p/3910264.html 同事遇到过很多次 之前懒的处理 这次看到这个blog 下次遇到了 处理一下 ...

  4. 一些char和byte对应的字符

    1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 2 ...

  5. 前端js区域上下拖拽

    先说说需求吧,网页内又上下两个区域,需要做到的功能是,第一个区域A底部的边可以进行拖拽使得区域变大或变小,同时第二个区域B跟着拖动的变化进行自适应. 思路: 1.使用一个假的div定义为那条可进行拖拽 ...

  6. Flask上下文管理、session原理和全局g对象

    一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...

  7. 【并发编程】【JDK源码】CAS与synchronized

    线程安全 众所周知,Java是多线程的.但是,Java对多线程的支持其实是一把双刃剑.一旦涉及到多个线程操作共享资源的情况时,处理不好就可能产生线程安全问题.线程安全性可能是非常复杂的,在没有充足的同 ...

  8. 洛谷 P3327 【[SDOI2015]约数个数和】

    前置芝士 关于这个题,你必须知道一个这样奇奇怪怪的式子啊QAQ \[d(i*j)= \sum_{x|i} \sum_{y|j}[gcd(x,y)=1] \] 留坑,先感性理解:后面那个gcd是为了去重 ...

  9. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 构建目录环境和依赖)

    引言:在用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一   的基础上 继续进行项目搭建 该部分的主要目的是测通MyBatis 及Spring-dao ...

  10. opencv-python下简单KNN分类识别

    KNN是数据挖掘中一种简单算法常用来分类,此次用来聚类实现对4种花的简单识别. 环境:python2.7+opencv3.0+windows10 原理:在使用KNN函数提取出4种花特征点以后,对需要辨 ...