基於圖片的cdn最終得到blob對象
- 實現並不是直接下載cdn圖片,所以最終blob數據大小和cdn原圖有偏差
- 通過cdn判斷資源是否是圖片
- 通過cdn鏈接拿到圖片資源,繪製在畫布上
- canvas上下文的方法,轉爲base64格式
- base64轉化爲blob對象
- 有多張cdn圖片需要處理爲blob的情況下,請妥善使用Promise處理異步事件
- 此方法適合對按cdn圖片格式最終轉化成的圖片格式對應的需求,但大小方面需要自己判斷後壓縮
- 如果對最終轉化圖片無格式要求,convertUrlToBase64函數中的變量ext可以直接寫成’jpeg’,利用canvas上下文,可以更加精準的壓縮
function isImage(ext) {
if (ext == 'png' || ext == 'jpg' || ext == 'jpeg' || ext == 'gif' || ext == 'bmp') {
return true;
}
}
function convertUrlToBase64(url) {
return new Promise(function (resolve, reject) {
let img = new Image();
img.crossOrigin = 'Anonymous';
img.src = url;
img.onload = function () {
let canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
let ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, img.width, img.height);
let ext = img.src.substring(img.src.lastIndexOf('.') + 1).toLowerCase();
let dataURL = canvas.toDataURL('image/' + ext);
let base64 = {
dataURL: dataURL,
type: 'image/' + ext,
ext: ext
};
resolve(base64);
};
});
}
function convertBase64UrlToBlob(base64) {
let parts = base64.dataURL.split(';base64,');
let contentType = parts[0].split(':')[1];
let raw = window.atob(parts[1]);
let rawLength = raw.length;
let uInt8Array = new Uint8Array(rawLength);
for (let i = 0; i < rawLength; i++) {
uInt8Array[i] = raw.charCodeAt(i);
}
return new Blob([uInt8Array], {type: contentType});
}
function cdnToBlob(url,cb) {
let ext = url.slice(url.lastIndexOf('.') + 1).toLowerCase();
if (isImage(ext)) {
convertUrlToBase64(url).then(function (base64) {
if (typeof cb === 'function') cb(convertBase64UrlToBlob(base64));
});
}
}
cdnToBlob(
'一張圖片cdn的地址',
function(blob){
console.log(blob)
})