以下代码是以vue语法为主,如果使用其他框架,请更改语法
图片上传并获取图片方法
图片上传
本方法是获取图片的文件流,通过formData方法处理图片参数以文件流方式传递到后台(同样支持文件);
为
input
绑定change
事件,并绑定accept
1
<input type="file" ref="input" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" @change="uploadImg($event)">
通过
change
方法获取图片
1 | uploadImg(e) { |
获取上传的图片
如果在图片上传之前需要预览图片,可以通过以下方法获取图片,url
绑定到img
标签即可
1 | getObjectURL(file) { |
判断图片链接是否有效
- 场景:如果后台返回图片链接,如果有效则展示,无效的话不展示
- 原理:通过img标签引入图片,可以通过
img
的onload
(有效)和onerror
(无效)回调来区分
注意回调方法是异步的
1 | checkImgExists(imgurl) { |
图片压缩
图片压缩
方法有点长,懒得分了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/**
*
* @param {文件} file
* @param {配置属性} options
* @param {回调函数} callback
*/
loopPhotoCompress(file, options, callback) {
options.size = 1;//此处的单位为MB
var self = this;
var imgtype = 'image/jpeg';
// 用FileReader读取文件
var reader = new FileReader();
// 将图片读取为base64
reader.readAsDataURL(file);
reader.onload = function (evt) {
var base64 = evt.target.result;
// 创建图片对象
var img = new Image();
// 用图片对象加载读入的base64
img.src = base64;
img.onload = function () {
var that = this,
canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d');
canvas.setAttribute('width', that.width);
canvas.setAttribute('height', that.height);
// 将图片画入canvas
ctx.drawImage(that, 0, 0, that.width, that.height);
// 压缩到指定体积以下(M)
if (options.size) {
var scale = 0.9;
(function f(scale) {
if (base64.length / 1024 / 1024 > options.size && scale > 0) {
base64 = canvas.toDataURL(imgtype, scale);
scale = scale - 0.1;
f(scale);
} else {
callback(self.convertBase64UrlToBlob(base64, file));
}
})(scale);
} else if (options.scale) {
// 按比率压缩
base64 = canvas.toDataURL(imgtype, options.scale);
callback(self.convertBase64UrlToBlob(base64, file));
}
}
}
}
base64转file文件流
1 |
|
图片增加马赛克
- 获取图片写入到
canvas
,通过检测鼠标的落下,移动、抬起事件,获取矩形 - 通过
getImageData
方法获取图片像素点数组 - 通过改变数据中像素点的颜色(不同像素点交换颜色)
setXY
方法
getImageData
此方法对于跨域图片,浏览器会进行拦截,服务器需要设置允许跨域访问
文件:图片增加马赛克