[js] imgDom、blob、base64、url之间的转换

function imgDom2base64(temp1) {
    let img = temp1;
    let Eurl = new URL(img.src);

    let url = Eurl.href;
    for (let i of ["jpg", "png", "gif", "svg", "bmp", "ico", "webp"]) {
        if (Eurl.pathname.includes(i)) {
            url = Eurl.origin + Eurl.pathname;
        }
    }
    url2Blob(url).then((blob) => {
        blob2Base64(blob).then((str) => {
            console.log(str)
        })
    })
}

// tool
/**
 * 
 * @param {str} url 
 * @returns  {Promise<Boolean|any>} 
 */
function url2Blob(url) {
    return new Promise((resolve, reject) => {
        window.fetch(url).then(
            (fulfilled) => {
                fulfilled.blob().then(
                    (blob) => { resolve(blob); },
                    (rejected) => { reject(rejected); }
                )
            },
            (rejected) => { reject(rejected); });
    })
}
/**
 * 
 * @param {Boolean} blob 
 * @returns {Promise<str|any>}
 */
function blob2Base64(blob) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.addEventListener('load', () => {
            const base64 = reader.result?.toString() || '';
            resolve(base64);
        });
        reader.addEventListener('error', () => {
            reject(new Error('message'));
        });
        reader.readAsDataURL(blob);
    });
}

/**
 * 
 * @param {str} blob 
 * @returns {str}
 */
function base642BUrl(data) {
    var parts = data.split(';base64,'),
        contentType = parts[0].split(':')[1],
        raw = window.atob(parts[1]),
        length = raw.length,
        arr = new Uint8Array(length);
    for (var i = 0; i < length; i++) {
        arr[i] = raw.charCodeAt(i);
    }
    var blob = new Blob([arr], { type: contentType });
    return URL.createObjectURL(blob);
};

/**
 * 
 * @param {str} url 
 * @returns {str|any}
 */
function url2Base64(url, type = 'image/jpeg') {
    return new Promise((resolve, reject) => {
        const img = new Image()
        const canvas = document.createElement('canvas');
        img.crossOrigin = '*';
        img.onload = function () {
            const width = img.width, height = img.height;
            canvas.width = width;
            canvas.height = height;

            const ctx = canvas.getContext('2d');
            ctx.fillStyle = 'white';
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            ctx.drawImage(img, 0, 0, width, height);
            const base64 = canvas.toDataURL(type);
            resolve(base64);
        };
        img.onerror = function () {
            reject(new Error('message'));
        };
        img.src = url;
    });
}

/**
 * 
 * @param {Boolean} blob 
 * @returns {str}
 */
function blob2BUrl(blob) {
    return URL.createObjectURL(blob);
}

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值