uniapp H5图片上传压缩自动旋转
16lz
2021-07-22
uniapp H5图片上传压缩自动旋转
分类:uni-app图片压缩复制代码//H5压终审图片上传 const upload= async (opt) => { let maxWidth = 500; //压缩图片最大宽度 opt = opt || {}; opt.url = opt.url || ''; opt.success = opt.success || function(){ }; console.log(opt.url) let Orientation = 1; //获取图片META信息 await getImageTag(opt.url, 'Orientation', function(e) { if(e != undefined) Orientation = e; }) var img = null; var canvas = null; await comprossImage(opt.url, maxWidth, function(e) { img = e.img; canvas = e.canvas; }) console.log(Orientation) let baseStr = ''; //如果方向角不为1,都需要进行旋转 switch(Orientation){ case 6://需要顺时针(向右)90度旋转 console.log('(向右)90度旋转'); baseStr = rotateImg(img,'right',canvas); break; case 8://需要逆时针(向左)90度旋转 console.log('向左)90度旋转'); baseStr = rotateImg(img,'left',canvas); break; case 3://需要180度旋转 转两次 console.log('需要180度旋转'); baseStr = rotateImg(img,'right',canvas, 2); break; default: baseStr = rotateImg(img,'',canvas); break; } opt.success(baseStr); //公共方法的回调函数 } const comprossImage = async (imgSrc, maxWidth, func) => { if(!imgSrc) return 0; return new Promise((resolve, reject) => { uni.getImageInfo({ src: imgSrc, success(res) { let img = new Image(); img.src = res.path; console.log(img) let canvas = document.createElement('canvas'); let obj = new Object(); obj.img = img; obj.canvas = canvas; resolve(func(obj)); } }); }) } /** * @desc 获取图片信息,使用exif.js库,具体用法请在github中搜索 * @param {Object} file 上传的图片文件 * @param {String} tag 需要获取的信息 例如:'Orientation'旋转信息 * @return {Promise<Any>} 读取是个异步操作,返回指定的图片信息 */ const getImageTag = (file, tag, suc) => { if (!file) return 0; return new Promise((resolve, reject) => { /* eslint-disable func-names */ // 箭头函数会修改this,所以这里不能用箭头函数 let imgObj = new Image() imgObj.src = file console.log(imgObj) uni.getImageInfo({ src: file, success(res) { Exif.getData(imgObj, function () { Exif.getAllTags(this); let or = Exif.getTag(this,'Orientation');//这个Orientation 就是我们判断需不需要旋转的值了,有1、3、6、8 resolve(suc(or)) }); } }) }); }; //网上提供的旋转function const rotateImg = (img, direction, canvas, times = 1) => { console.log('开始旋转') //最小与最大旋转方向,图片旋转4次后回到原方向 var min_step = 0; var max_step = 3; if (img == null)return; //img的高度和宽度不能在img元素隐藏后获取,否则会出错 var height = img.height; var width = img.width; let maxWidth = 500; let canvasWidth = width; //图片原始长宽 let canvasHeight = height; let base = canvasWidth/canvasHeight; console.log(maxWidth); if(canvasWidth > maxWidth){ canvasWidth = maxWidth; canvasHeight = Math.floor(canvasWidth/base); } width = canvasWidth; height = canvasHeight; var step = 0; if (step == null) { step = min_step; } if (direction == 'right') { step += times; //旋转到原位置,即超过最大值 step > max_step && (step = min_step); } else if(direction == 'left'){ step -= times; step < min_step && (step = max_step); } else { //不旋转 step = 0; } //旋转角度以弧度值为参数 var degree = step * 90 * Math.PI / 180; var ctx = canvas.getContext('2d'); console.log(degree) console.log(step) switch (step) { case 1: console.log('右旋转 90度') canvas.width = height; canvas.height = width; ctx.rotate(degree); ctx.drawImage(img, 0, -height, width, height); break; case 2: //console.log('旋转 180度') canvas.width = width; canvas.height = height; ctx.rotate(degree); ctx.drawImage(img, -width, -height, width, height); break; case 3: console.log('左旋转 90度') canvas.width = height; canvas.height = width; ctx.rotate(degree); ctx.drawImage(img, -width, 0, width, height); break; default: //不旋转 canvas.width = width; canvas.height = height; ctx.drawImage(img, 0, 0, width, height); break; } let baseStr = canvas.toDataURL("image/jpeg", 1); return baseStr; }
更多相关文章
- 通过canvas作图片缓存
- 懒加载及轮播图
- 轮播图和懒加载
- 轮播图实现
- html 背景图片全局填充
- PHP:文件上传上传限制,文件大小不超过5M,文件后缀设置,检查图片合
- 详解支撑7亿用户搜索的百度图片处理收录中台
- 花瓣网图片怎样下载到本地
- 苹果Mac查看多张图片的方法