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. 虚拟机的Vmtools

    安装了虚拟机之后,文件共享不方便,安装VMTools可以在windows上直接拖文件到linux上. 安装方法: 1.进入linux把CD弹出 2.打开虚拟机之后 3.下载完成可以在linux的CD设 ...

  2. Python - Django - ORM 自定义表名

    通过 Django 建立的表 命名方式为:项目名_表名 可以将该默认命名方式进行修改 models.py: from django.db import models class Person(mode ...

  3. 有哪些可能的原因导致BDE死掉啊啊,求救了,谢谢

    一个服务程序在后台跑,用到了BDE访问SQLServer,隔了一段时间就会莫名其妙的与数据库连接失败,查了一下BDE,发现已经死掉了,bde administrator也无法打开,报错,重启或注销机器 ...

  4. realloc(void *__ptr, size_t __size)

    #include <stdlib.h>realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小.如果 ...

  5. [转]gcc的__builtin_函数介绍

    链接地址:https://blog.csdn.net/jasonchen_gbd/article/details/44948523

  6. Newtonsoft.Json 方法使用()

    JSON.NET1.3.0,旧版本的json.net,使用Newtonsoft.Json.JavaScriptConvert.DeserializeObject类进行转换 如果是新版本的json.ne ...

  7. vi 替换命令 以及“找不到模式”解决

    转自:https://www.cnblogs.com/zfyouxi/p/5181363.html 在linux vi编辑工具中使用替换命令操作时,会出现明明有匹配查找模式的数据.却报“找不到模式”问 ...

  8. Django:将后台返回的数据填充到select下拉框中

    select选择框如下: <select data-placeholder="选择项目..." class="form-control" name=&qu ...

  9. RocketMQ控制台命令

    本文未完成,有空再补充,不小心发布了,抱歉 Rocket版本:4.3.0 这几天在整RocketMQ,可谓是困难重重,其中关于控制台的命令,网上的都是一半一半的, 所以我打算直接用整一个完整的官方的命 ...

  10. MySQL的索引有哪些

    一.索引是什么 索引,在MySQL中也叫“键(key)”,是存储引擎用于快速找到记录的一种数据结构.如果把数据库的一张表比作一本书,那索引则是这本书的目录,通过目录,我们能快速找到我们想要的主题所对应 ...