data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGU....
报错是因为没有去除 data:image/png;base64,应只要后面的文件流
1. base64 : 可以直接当作链接地址使用
1
|
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGU.... |
2. File 对象:
File{
lastModified: 1649490762164
lastModifiedDate: Sat Apr 09 2022 15:52:42 GMT+0800 (GMT+08:00) {}
name: "1649490762160-251.png"
size: 25748
type: "image/png"
webkitRelativePath: ""
[[Prototype]]: File
}
3. Blob 对象
1
2
3
4
5
|
Blob{ size: 25748 type: "image/png" [[Prototype]]: Blob } |
除了base64 可以直接当作链接使用,File 对象和Bolb 对象也可以通过转换 成base64 直接使用,或者使用
window.URL.createObjectURL(File 对象或者Bolb 对象) 直接生成链接 : 类似:blob:null/22ec44b8-5864-4960-8ea8-a71a7e40bb63
所以:能直接当作链接是使用在这三者关系中有
1
2
|
1. data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGU.... 2. blob: null /22ec44b8-5864-4960-8ea8-a71a7e40bb63 |
一:base64 转 Blob 对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//base64 转 Blob对象 /* base64: data:image/png;base64,iVB.... /* Blob:{...} */ function base64ToBlob(data) { var arr = data.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 }); } |
二: base64 转 File 对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/** base64 转 File 对象 /* @param data base64 /* @param filename 自定义文件名 /* @return File 对象 */ function base64ToFile(data, filename) { var arr = data.split( ',' ), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); let suffixArr = mime.split( "/" ) if (suffixArr.length && !filename) { let suffix = suffixArr[suffixArr.length - 1] filename = new Date().getTime() + "-" + Math.floor((Math.random() * 10000)) + "." + suffix } while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, { type: mime }); } |
三: File 对象,Blob 对象 转base64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//blob ,File 对象 转 base64 function blobFileTobase64(blobFile) { let reader = new FileReader() reader.readAsDataURL(blobFile); return new Promise((resolve, reject) => { reader.onload = function () { resolve( this .result) } reader.onerror = (err) => { reject(err); }; }) } |
四: blob链接转 base64 :利用canvas.toDataURL的API转化成base64
1
2
|
blob: null /22ec44b8-5864-4960-8ea8-a71a7e40bb63 转为 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGU.... |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
function urlToBase64(url, type = "image/png" ) { return new Promise((resolve, reject) => { let img = new Image() img.src = url img.onload = function () { let canvas = document.createElement( "canvas" ) canvas.width = this .naturalWidth canvas.height = this .naturalHeight let ctx = canvas.getContext( "2d" ) ctx.drawImage(img, 0, 0) let result = canvas.toDataURL(type || 'image/png' ) resolve(result) } img.onerror = function (err) { reject(err) } }) } |
五: 压缩图片:接收一个File/Blob 对象,返回的是一个base64
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
|
/* blobFile:file/blob 对象 option:{type:"image/jpeg",width:'',height:"",quality:0.92,scale:1} */ function compressImg(blobFile, option = {}) { return new Promise((resolve, reject) => { let reader = new FileReader() reader.onload = function () { let img = new Image() img.src = this .result img.onload = function () { console.log( "原图片大小:" , this .src.length); //这是base64 ,所以可以指定图片大小 let imgSize = this .src.length; let targetSize = 100 * 1024; if (imgSize <= targetSize) { return resolve( this .src) } let canvas = document.createElement( "canvas" ) let ctx = canvas.getContext( "2d" ) //原图尺寸 let imgW = this .naturalWidth let imgH = this .naturalHeight //新图比例大小 let scale = option.scale || 1; let ratio = imgW / imgH; //宽高比例 let targetW = option.width || imgW * scale let targetH = option.height || imgH * scale canvas.width = targetW canvas.height = targetH ctx.drawImage(img, 0, 0, targetW, targetH) let fileType = blobFile.type || option.type || 'image/jpeg' let quality = option.quality || 0.5 let result = canvas.toDataURL(fileType, quality) console.log( "压缩后:" , result.length) resolve(result) } } reader.onerror = function () { reject( new Error(`${blobFile} must is Blob or File 对象`)) } reader.readAsDataURL(blobFile) }) } |