我是靠谱客的博主 迷人缘分,这篇文章主要介绍vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理,现在分享给大家,希望可以做个参考。

一、前言

  三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习。

  图片的上传之前都是用的插件(ajaxupload),或者传统上传图片的方式,各有利弊:插件的问题是依赖jq并且会使系统比较臃肿,还有传统的web开发模式 前后端偶尔在一起及对用户体验要求低,现在公司采用webpack+vue+restfullApi开发模式 前后端完全分离,遵从高内聚,低偶尔的原则,开发人员各司其职,一则提升开发效率(从长期来看,短期对于很多开发人员需要有个适应的过程,特别是初中级的前端处理业务逻辑方面的能力比较欠缺),二则提升用户体验。今天分享下在项目开发中写的的图片上传 vue组件。

二、处理问题

  这里用h5做图片上传考虑到浏览器支持的问题,这里考虑的场景是在做webapp的时候

  1.移动web图片上传还包括拍摄上传,但是在移动端会出现拍摄的照片会旋转,处理这个问题需要得到图片旋转的情况,可以用exif.js来获取,具体可以参看文档

  2.图片压缩

  3.旋转

三、代码

1组件代码

复制代码
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<template> <div> <input type="file" style="display: none;" id="img-upload" multiple accept="image/*" @change="uploadImg($event)"/> </div> </template> <script> import EXIF from '../../../Resource/Global/Js/exif' export default{ name:"image-html5-upload", props:{ imgArr:{ type:Array, twoWay: true, default:Array }, imgNumLimit:{//一次最多可以上传多少张照片 type:Number, default:4 } }, methods:{ "uploadImg": function(e){ let tag = e.target; let fileList = tag.files; let imgNum = fileList.length; let _this = this; _this.imgArr = [];//图片数据清零 if(this.imgArr.length + imgNum > this.imgNumLimit){ alert('一次最多上传'+this.imgNumLimit+'张图片!'); return; } var Orientation; for(let i=0;i<imgNum;i++){ EXIF.getData(fileList[i], function(){ Orientation = EXIF.getTag(fileList[i], 'Orientation'); }); let reader = new FileReader(); reader.readAsDataURL(fileList[i]); reader.onload = function(){ var oReader = new FileReader(); oReader.onload = function(e) { var image = new Image(); image.src = e.target.result; image.onload = function() { var expectWidth = this.naturalWidth; var expectHeight = this.naturalHeight; if (this.naturalWidth > this.naturalHeight && this.naturalWidth > 800) { expectWidth = 800; expectHeight = expectWidth * this.naturalHeight / this.naturalWidth; } else if (this.naturalHeight > this.naturalWidth && this.naturalHeight > 1200) { expectHeight = 1200; expectWidth = expectHeight * this.naturalWidth / this.naturalHeight; } var canvas = document.createElement("canvas"); var ctx = canvas.getContext("2d"); canvas.width = expectWidth; canvas.height = expectHeight; ctx.drawImage(this, 0, 0, expectWidth, expectHeight); var base64 = null; //修复ios上传图片的时候 被旋转的问题 if(Orientation != "" && Orientation != 1){ switch(Orientation){ case 6://需要顺时针(向左)90度旋转 _this.rotateImg(this,'left',canvas); break; case 8://需要逆时针(向右)90度旋转 _this.rotateImg(this,'right',canvas); break; case 3://需要180度旋转 _this.rotateImg(this,'right',canvas);//转两次 _this.rotateImg(this,'right',canvas); break; } } base64 = canvas.toDataURL("image/jpeg", 0.8); if(fileList[i].size / 1024000 > 1){ _this.imgScale(base64, 4) }else{ _this.imgArr.push({"src": base64}); } console.log(JSON.stringify(_this.imgArr)); }; }; oReader.readAsDataURL(fileList[i]); } } }, "imgScale": function(imgUrl,quality){ let img = new Image(); let _this = this; let canvas = document.createElement('canvas'); let cxt = canvas.getContext('2d'); img.src = imgUrl; img.onload = function(){ //缩放后图片的宽高 let width = img.naturalWidth/quality; let height = img.naturalHeight/quality; canvas.width = width; canvas.height = height; cxt.drawImage(this, 0, 0, width, height); _this.imgArr.push({"src": canvas.toDataURL('image/jpeg')}); } }, "rotateImg":function (img, direction,canvas) {//图片旋转 var min_step = 0; var max_step = 3; if (img == null)return; var height = img.height; var width = img.width; var step = 2; if (step == null) { step = min_step; } if (direction == 'right') { step++; step > max_step && (step = min_step); } else { step--; step < min_step && (step = max_step); } var degree = step * 90 * Math.PI / 180; var ctx = canvas.getContext('2d'); switch (step) { case 0: canvas.width = width; canvas.height = height; ctx.drawImage(img, 0, 0); break; case 1: canvas.width = height; canvas.height = width; ctx.rotate(degree); ctx.drawImage(img, 0, -height); break; case 2: canvas.width = width; canvas.height = height; ctx.rotate(degree); ctx.drawImage(img, -width, -height); break; case 3: canvas.width = height; canvas.height = width; ctx.rotate(degree); ctx.drawImage(img, -width, 0); break; } } } } </script>

2.使用方法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
<template> <div> <div class="album-img-list"> <ul> <li v-for="img in imgList"><div class="album-bg-img"><img :src='img.src'> </div></li> </ul> </div> <div class="album"> <label for="img-upload">上传照片</label> <image-html5-upload :img-arr.sync="imgList"></image-html5-upload> </div> </div> </template>

以上所述是小编给大家介绍的vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

最后

以上就是迷人缘分最近收集整理的关于vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理的全部内容,更多相关vuejs开发组件分享之H5图片上传、压缩及拍照旋转内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(136)

评论列表共有 0 条评论

立即
投稿
返回
顶部