uni-app图片压缩转base64位 利用递归来实现多张图片压缩
//选择图片
chooseImage(){
let that =this
uni.chooseImage({
sizeType: ['original','compressed'], //可以指定是原图还是压缩图,默认二者都有
count: ,//默认9
success: (rem) => {
console.log(rem)
that.tempFilePaths = rem.tempFilePaths;
//#ifdef MP-WEIXIN
//图片压缩并转base64
that.weixin_img(,rem)
//#endif //#ifdef APP-PLUS
//图片压缩
that.app_img(,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+,rem.tempFiles[num].path.length);//截取图片类型如png jpg
let img_yuanshi = rem.tempFiles[num].path.substring(,index);//截取图片原始路径
let d2 = new Date().getTime(); //时间戳
//压缩图片
plus.zip.compressImage(
{
src:rem.tempFiles[num].path,//你要压缩的图片地址
dst:img_yuanshi+d2+'.'+img_type,//压缩之后的图片地址(注意压缩之后的路径最好和原生路径的位置一样,不然真机上报code-5)
quality://[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(",")[])//拿到'data:image/jpeg;base64,'后面的 rem.tempFiles[num].Base64_Path=evt.target.result.split(",")[]
}
})
})
that.materialList = that.materialList.concat(rem.tempFiles[num]);
//利用递归循环来实现多张图片压缩
if(num==rem.tempFiles.length-){
return
}else{
that.app_img(num+,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 = ;
// 保证宽高均在200以内
while (canvasWidth > || canvasHeight > ){
//比例取整
canvasWidth = Math.trunc(res.width / ratio)
canvasHeight = Math.trunc(res.height / ratio)
ratio++;
}
//绘制新图
ctx.drawImage(rem.tempFiles[num].path, , , canvasWidth, canvasHeight)
ctx.draw(false, () => {
//获取图像数据, API 1.9.0
wx.canvasGetImageData({
canvasId: 'attendCanvasId',
x: ,
y: ,
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-){
return
}else{
that.weixin_img(num+,rem)
}
console.log('end',that.materialList)
}
})
})
},
}) },
// 兼容处理:ios获取的图片上下颠倒
reverseImgData(res) {
var w = res.width
var h = res.height
let con =
for (var i = ; i < h / ; i++) {
for (var j = ; j < w * ; j++) {
con = res.data[i * w * + j]
res.data[i * w * + j] = res.data[(h - i - ) * w * + j]
res.data[(h - i - ) * w * + 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位 利用递归来实现多张图片压缩的更多相关文章
- 使用javascript把图片转成base64位编码,然后传送到服务端(ajax调用的接口基于drupa7)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 图片转成base64位 页面中图片展示
<img src="data:image/gif;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABG ...
- Java通过图片url地址获取图片base64位字符串的两种方式
工作中遇到通过图片的url获取图片base64位的需求.一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥. 之后 ...
- js 图片压缩上传(base64位)以及上传类型分类
一.input file上传类型 1.指明只需要图片 <input type="file" accept='image/*'> 2.指明需要多张图片 <input ...
- 图片上传前 压缩,base64图片压缩 Exif.js处理ios拍照倒置等问题
曾写过在前端把图片按比例压缩不失真上传服务器的前端和后台,可惜没有及时做总结保留代码,只记得js利用了base64位压缩和Exif.js进行图片处理,还有其中让我头疼的ios拍照上传后会倒置等诸多问题 ...
- svg转化成canvas以便生成base64位的图片
很久前写了关于把html转成图片的一个例子,最近有出了新的问题.利用html2canvas.js文件把html转成base64位的图片是没什么问题的,但也不是绝对的,比如这时候不能碰见svg这个鬼,h ...
- mui开发app之js将base64转图片文件
之前我已经做过一个利用cropper裁剪并且制作头像的功能.如何在mui app中实现相册或相机获取图片后裁剪做头像请看另一篇博客:mui开发app之cropper裁剪后上传头像的实现 但是当时裁剪后 ...
- 小程序实现图片上传,预览以及图片base64位处理
最近一段时间在做小程序项目,第一期功也完工了.需要好好总结一下经验,把项目中遇到的问题好好总结一下,遇到的问题,踩过的坑.今天写一个小程序实现图片上传,预览,以及删除,图片base64位处理.下面就是 ...
- 微信小程序开发——base64位图片显示问题
前言: 目前小程序项目需要后端借口提供验证码图片,后端是以base64位返回的,按照H5的做法,前边拼上 data:image/png;base64, 应该就可以了,关键代码如下: H5: <i ...
随机推荐
- PS制作科幻特效的金色立体文字
最终效果 一.Photoshop打开背景素材. 二.然后我们来制作字效,首先当然是在画布上打上字了,在这里要注意的是尽量选一些艺术字体,这样做出来的效果比较好些,我这里用到的字体为“Matura MT ...
- 软件工程(FZU2015) 赛季得分榜,第一回合
SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...
- Linux基础操作文件等基础操作
作业一: 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) [root@bogon /]# cd /etc [root@bogon etc]# cat passwd ...
- Python面试知识点小结
一.Python基础 1.Python语言特性: 动态型(运行期确定类型,静态型是编译型确定类型),强类型(不发生隐式转换,弱类型,如PHP,JavaScript就会发生隐患式转换) 2.Python ...
- MyBatis基础:MyBatis调用存储过程(6)
1. 存储过程准备 CREATE PROCEDURE sp_task ( IN userId INT ) BEGIN SELECT * FROM task WHERE user_id = userId ...
- IIS部署ASP.Net Core 502.5错误和解决
在Win7的机器上部署ASP.Net Core程序,老是提示502.5错误. 已经安装了 Microsoft Visual C++ 2015 Redistributable .NET Core Win ...
- EventBus 线程切换原理
主要问题其实只有两个,其一:如何判断当前发送事件的线程是否是主线程:其二:如何在接收事件时指定线程并执行: 一个一个来看. 1.如何判断是否在主线程发送 EventBus在初始化的时候会初始化一个Ma ...
- 【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)
[HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了. 首先发现终止态一定是所有点都向\(n\)连边( ...
- java 11 局部变量类型推断
什么是局部变量类型推断? var javastack = "javastack"; System.out.println(javastack); 大家看出来了,局部变量类型推断就是 ...
- 3.24网络攻防选拔题部分write up
20175221 3.24网络攻防选拔题部分write up Q1:百度一下,你就知道 解压题目得到一个文件夹和一个网址 打开文件夹,有三张图片 用winhex和stegsolve查看三张图片,没有 ...