// 之前的代码 // ... // 最后一行 imageElement.src = 'xxx' 替换: getDataUrlBySrc('xxx').then(b64 => (imageElement.src = b64)); function getDataUrlBySrc(src: string) { return new Promise<string>((resolve, reject) => { if (Cache.localGet("isIE")) { const xmlHTTP = new XMLHttpRequest(); xmlHTTP.open("GET", src, true); // 以 ArrayBuffer 的形式返回数据 xmlHTTP.responseType = "arraybuffer"; xmlHTTP.onload = function(e) { // 1. 将返回的数据存储在一个 8 位无符号整数值的类型化数组里面 const arr = new Uint8Array(xmlHTTP.response); // 2. 转为 charCode 字符串 const raw = Array.prototype.map .call(arr, charCode => String.fromCharCode(charCode)) .join(""); // 3. 将二进制字符串转为 base64 编码的字符串 const b64 = btoa(raw); const dataURL = "data:image/jpeg;base64," + b64; resolve(dataURL); }; xmlHTTP.onerror = function(err) { reject(err); }; xmlHTTP.send(); } else { resolve(src); } }); }
尝试了一下,成功达到了目的。
后来查阅资料得知,如果 canvas 污染了,那无论是 toDataURL 还是 toBlob,都是无法执行成功的。
缺陷
虽然这个方法可以达到目的,但是却牺牲了性能。要先请求一次图片数据不说,数据编码的转换也是相当耗时的。小图还好,如果图片比较大,例如超过 3M ,那整个流程需要花费的时间可以达到一两分钟,这是不可接受的。
canvas的toDataUrl是否会压缩图像?
使用canvas的drawImage方法将image对象draw到canvas画布上时,图片大小会显著增加,并且只能保存为PNG格式。
将canvas用toDataUrl转化为base64,即使encoderOptions设置为1,图片也会有较大幅度的减小,但是比起最初的image还是要大。如果encoderOptions使用默认的0.92,最终的图片大小和初始的是相差不多的
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对黑区网络的支持。