js部分:
module.exports = {
resize: function (file, callback, options) {
//配置
options = Object.assign({
maxWidth: 1920,
maxHeight: 1920
}, options || {}); var reader = new FileReader();
reader.onload = function () {
var imageData = this.result;
//加载图片获取图片真实宽度和高度
var image = new Image();
image.src = imageData;
image.onload = function () {
// 获取图片旋转角度
var orientation = 1
EXIF.getData(image, function() {
orientation = EXIF.getTag(this, "Orientation");
}); var width = image.width;
var height = image.height;
var scale = Math.max(width / options.maxWidth, height / options.maxHeight);
//宽度或高度计算
if (scale > 1) {
var w = Math.round(width / scale);
var h = Math.round(height / scale);
//生成canvas
var canvas = document.createElement('canvas');
var ctx = window.ctx = canvas.getContext('2d');
ctx.save()
switch(orientation){
case 6:
console.log('需要顺时针(向左)90度旋转');
canvas.width = h;
canvas.height = w;
ctx.translate(canvas.width/2,canvas.height/2);
ctx.rotate(90 * Math.PI / 180)
ctx.drawImage(this, -w / 2, -h / 2, w, h);
break;
case 8:
console.log('需要逆时针(向右)90度旋转');
canvas.width = h;
canvas.height = w;
ctx.translate(canvas.width/2,canvas.height/2);
ctx.rotate(-90 * Math.PI / 180)
ctx.drawImage(this, -w / 2, -h / 2, w, h);
break;
default:
canvas.width = w;
canvas.height = h;
ctx.drawImage(this, 0, 0, w, h);
break
}
ctx.restore()
imageData = canvas.toDataURL('image/jpeg');
}
callback && callback(imageData);
};
};
reader.readAsDataURL(file);
},
convertBase64UrlToBlob: function (urlData) {
var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type: mime});
}
}
页面引用: import imageUtils from '../components/imageUtils'
mounted() {
let self = this;
let image = document.getElementById('image');
this.cropper = new Cropper(image, {
viewMode: 3,
dragMode:'move',
autoCropArea: 1,
ready: function () {
self.croppable = true;
}
});
}, change (e) {
    let files = e.target.files || e.dataTransfer.files;
if (!files.length) return;
let file = e.target.files[0];
let type = file.type; //文件的类型,判断是否是图片
let size = file.size; //文件的大小,判断图片的大小
if (this.imgCropperData.accept.indexOf(type) == -1) {
mui.toast('请上传JPG/JPEG/PNG格式的图片',1500)
return false;
}
if(file) {
this.file = file;
imageUtils.resize(file,(data)=>{
// 这里的this 指向reader
this.url = data;
this.isUpload = false;
//每次替换图片要重新得到新的url
if(this.cropper){
this.cropper.replace(this.url);
}
document.getElementById("change").value =''; //input 要清空,不然上传同一张会有bug
},{maxWidth:720,maxHeight:720})
}
},
//就用这张上传
upload: function(){
if(!this.url){
mui.toast('请先选择上传图片!',1500);
}else{
this.panel = false;
let croppedCanvas;
if (!this.croppable) {
return;
}
croppedCanvas = this.cropper.getCroppedCanvas({
width: 460,
height: 460,
});
var blob = this.convertBase64UrlToBlob(croppedCanvas.toDataURL('image/png'));
let requestData = new FormData();
this.bingKey = localStorage.getItem("bingKey")?localStorage.getItem("bingKey"):'';
requestData.append('bingKey',this.bingKey);
requestData.append('role',this.identity);
requestData.append('year',this.year);
requestData.append('sex',this.sex);
requestData.append('nickName',this.nickName);
requestData.append('imageUrl','123');
requestData.append('resType', '1');
requestData.append('noThumbnail', '1');
requestData.append('file', blob,'file_20190430_'+(new Date().getTime())+'.png');
console.log(requestData)
this.loadShow = true;
//this.$request.post(_basePath + '/activity/page20190430/createUserStory.html').then((data) => {
this.$request.post(_basePath+'/activity/page20190430/createUserStory.html',requestData,{headers:{'Content-Type':'multipart/form-data'}}).then((data)=>{
this.storyShow = true;
this.chooseShow = false;
this.uploadShow = false;
this.storyId = data.storyId;
this.storyUrl = data.storyUrl;
this.storyImgUrl = data.photoUrl;
this.photoUrl = data.photoUrl;
this.context = data.context;
this.ewmUrl =window.location.origin + document.getElementById('basePath').value + '/activity/page20190430/other.html?storyId='+data.storyId;
var img = new Image();
img.src = this.storyImgUrl;
img.onload = () => {
this.html2Img();
};
this.loadShow = false;
//注册分享
shareByApp('choose', {
'title':'',
'desc':'',
'imgUrl': window.location.origin + _basePath + '/activity/page20190430/img/share.png',
'link': window.location.origin + _basePath + '/activity/page20190430/other.html?storyId='+this.storyId
});
}).catch((res)=>{
this.loadShow = false;
if(res.code == 2) {
mui.toast('穿越失败~请上传高清的正脸照片哦~',2000);
return false;
}else if(res.code == 3){
mui.toast('你的名字含有敏感词,请修改',2000);
return false;
}else if(res.code == 4){
mui.toast('不存在角色',2000);
return false;
}else if(res.code == 9){
mui.toast('人太多勒~请稍后再试',2000);
return false;
}
})
}
},
// 将base64的图片转换为file文件
convertBase64UrlToBlob(urlData) {
var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
},
html2Img () {
let pageWrap = document.querySelector("#saveImg");
var canvas = document.createElement("canvas");
canvas.width = 720;
canvas.height = 1134;
canvas.className="hidden";
var context = canvas.getContext("2d");
function loadImage(images, callback) {
var total = 0;
var _loaded = 0;
for (var i in images) {
total++;
images[i].p.splice(0, 0, new Image());
images[i]['p'][0].setAttribute('crossOrigin', 'anonymous');
images[i]['p'][0].src = images[i].src;
images[i]['p'][0].onload = function () {
if (++_loaded >= total) {
callback(images);
}
};
}
};
var list = [
{
src:'./img/imgBg.png?v=1',
p:[0,0,720, 1134]
}, {
src:this.storyImgUrl,
p:[89,87,544,966]
}, {
src:'./img/ewmBg.png?v=1',
p:[0,969,720,165]
},{
src:document.querySelector(".ewmStyle").src,
p:[69,1001,85, 85]
}
];
loadImage(list,function(images) {
for(var i=0;i<images.length;i++){
context.drawImage(images[i]['p'][0],images[i]['p'][1],images[i]['p'][2],images[i]['p'][3],images[i]['p'][4]);
}
pageWrap.appendChild(canvas);
var base64ImgSrc = canvas.toDataURL("image/png");
var img = document.createElement("img");
img.crossOrigin="anonymous";
img.className = "resultImg fixed";
img.src = base64ImgSrc;
pageWrap.appendChild(img);
});
},

上传图片,图片过大压缩处理以及解决自拍时会出现图片横屏的bug修复、长按保存图片的更多相关文章

  1. <转载>CSS解决图片过大撑破DIV的方法

    DIV+CSS网页内容中如果插入大于DIV层宽度显示,过大的图片将会撑破网页宽度显示从而网页严重变形,您是否遇到过?这里DIVCSS5给大家介绍几种解决图片撑破撑开网页DIV层方法. 图片撑破宽度解决 ...

  2. HTML5 file API加canvas实现图片前端JS压缩并上传

    一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅 ...

  3. 图片流量节省大杀器:基于CDN的sharpP自适应图片技术实践

    版权声明:本文由陈忱原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/156 来源:腾云阁 https://www.qclou ...

  4. iOS 图片按比例压缩,指定大小压缩

    使用系统方法UIImageJPEGRepresentation(UIimage *image,CGFloat quality)进行图片质量压缩,暂且叫参数quality为压缩比吧,取值范围为0-1. ...

  5. ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)

    在写这篇的时候本来想把标题直接写成报错的提示,如下: “SecurityError:Blocked a frame with origin "http://localhost:55080&q ...

  6. ASP.NET 使用ajaxupload.js插件出现上传较大文件失败的解决方法

    在网上下载了一个ajaxupload.js插件,用于无刷新上传图片使的,然后就按照demo的例子去运行了一下,上传啊什么的都OK,但是正好上传的示例图片有一个比较大的,4M,5M的样子,然后上传就会报 ...

  7. weui上传多图片,前端压缩,base64编码

    记录一下在做一个报修功能的心路历程,需求功能很简单,一个表单提交,表单包含简单的文字字段以及图片 因为使用的是weui框架,前面的话去找weui的表单和图片上传组件,说实话,weui的组件写的还不错, ...

  8. 图片过大导致OOM

    原文:http://www.codeceo.com/article/android-load-image-oom.html 一.分析 在加载图片过程中出现的OOM的几种情况: 1. 加载的图片过大 2 ...

  9. nginx实现动态分离,解决css和js等图片加载问题

    改帖专门为使用nginx,通过nginx把请求转发到web服务器再返回客户端的时候,解决css和js和图片加载不出来的问题. 如果没安装nginx,请访问一下地址进行安装 http://www.cnb ...

随机推荐

  1. 全面系统Python3入门+进阶-1-7 课程内容与特点

    结束

  2. 生成有目录的pdf

    生成有目录的pdf 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://jingyan.baidu.com/article/ff411625c2153512e48237a ...

  3. 【433】COMP9024 复习

    目录: 01. Week01 - Lec02 - Revision and setting the scene 02. Week02 - Lec01 - Data structures - memor ...

  4. Python - Django - JsonResponse 对象

    用 json 模块和 HttpResponse 返回生成的 json views.py: from django.shortcuts import render, HttpResponse impor ...

  5. POJ 3903 Stock Exchange 最长上升子序列入门题

    题目链接:http://poj.org/problem?id=3903 最长上升子序列入门题. 算法时间复杂度 O(n*logn) . 代码: #include <iostream> #i ...

  6. pt-kill MySQL会话杀灭神器

    废话不多说,直接上例子: pt-kill --host=127.0.0.1 --user=xxx --password=xxxxxx --port=xxxx --busy-time 10 --matc ...

  7. Andrew Ng机器学习课程9-补充

    Andrew Ng机器学习课程9-补充 首先要说的还是这个bias-variance trade off,一个hypothesis的generalization error是指的它在样本上的期望误差, ...

  8. 最新 安易迅java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 安易迅等10家互联网公司的校招Offer,因为某些自身原因最终选择了 安易迅.6.7月主要是做系统复习.项目复盘.Leet ...

  9. ASP.NET CORE(C#)与Spring Boot MVC(JAVA)

    干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结   目录 C# VS JAVA 基础语法类比篇: 一.匿名类 二.类型初始化 三.委托(方 ...

  10. Django 之上下文处理器和中间件

    一.上下文处理器 上下文处理器是可以返回一些数据,在全局模板中都可以使用.比如登录后的用户信息,在很多页面中都需要使用,那么我们可以放在上下文处理器中,就没有必要在每个视图函数中都返回这个对象. 在s ...