JS實(shí)現(xiàn)將圖片URL轉(zhuǎn)base64示例詳解
背景介紹
最近有個(gè)需求是將部分DOM生成圖片上傳到服務(wù)器,這里就直接用之前項(xiàng)目使用的 html-to-image。
然而,這次與上次不同的是有一個(gè)圖片;其實(shí),html-to-image也支持了存在圖片的DOM生成截圖(embed-images)。
出現(xiàn)意外
不出意外的就該出意外了:

很容易理解,就是跨域了請(qǐng)求了。注意,這里本來之前使用img標(biāo)簽是能正常請(qǐng)求的,并且也不用加crossorigin屬性。 在調(diào)用html-to-image中加上mode: 'no-cors'依然不行。
進(jìn)入正題吧
然后就想自己搞轉(zhuǎn)base64吧,各種百度谷歌出來了
const image2Base64 = (url: string) => new Promise((resolve, reject) => {
if (!url) {
resolve('');
return;
}
const img = new Image();
img.crossOrigin = 'anonymous';
img.src = url;
img.onload = () => {
const canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
const ctx = canvas.getContext('2d');
ctx?.drawImage(img, 0, 0);
const data = canvas.toDataURL();
resolve(data);
};
img.onerror = () => {
reject('');
};
});
特別需要注意的是:img標(biāo)簽屬性是crossorigin,new Image需使用crossOrigin。 如果不設(shè)置crossOrigin會(huì)造成另一個(gè)問題:

在用canvas調(diào)用toDataURL方法中出錯(cuò)了。
然后又是各種百度谷歌,發(fā)現(xiàn)MDN有個(gè)權(quán)威又無語的解釋:

提煉一下哈:指定crossorigin的圖像,在canvas調(diào)用中不會(huì)出現(xiàn)tainted錯(cuò)誤。
其實(shí)上面已經(jīng)能解決大多數(shù)的問題了:

對(duì),沒猜錯(cuò),事情沒有絕對(duì)的,還是有個(gè)例的:

不知是這個(gè)圖片服務(wù)器咋設(shè)置的,各種吧啦吧啦溝通也不給設(shè)置跨域白名單啥的,只能自己想辦法了。
nodejs中間層轉(zhuǎn)
const http = require('http');
http.get(url, (res) => {
const chunks = [];
let size = 0;
res.on('data', (chunk) => {
chunks.push(chunk);
size += chunk.length;
});
res.on('end', () => {
const data = Buffer.concat(chunks, size);
const base64Data = data.toString('base64');
return base64Data;
});
});
結(jié)果,完美解決。
總結(jié)
- 使用crossOrigin能解決大多數(shù)情況
- 如果能在圖片服務(wù)器加跨域白名單最好
- 終極大招就是nodejs轉(zhuǎn)
- nodejs弊端:對(duì)于圖片無法使用CDN,對(duì)服務(wù)器壓力增大,慎用
以上就是JS實(shí)現(xiàn)將圖片URL轉(zhuǎn)base64示例詳解的詳細(xì)內(nèi)容,更多關(guān)于JS圖片URL轉(zhuǎn)base64的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript深拷貝方法structuredClone使用
這篇文章主要為大家介紹了JavaScript深拷貝方法structuredClone使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Javascript設(shè)計(jì)模式之原型模式詳細(xì)
這篇文章主要介紹了Javascript設(shè)計(jì)模式之原型模式,原型模式用于在創(chuàng)建對(duì)象時(shí),通過共享某個(gè)對(duì)象原型的屬性和方法,從而達(dá)到提高性能、降低內(nèi)存占用、代碼復(fù)用的效果。下面小編將詳細(xì)介紹 ,需要的朋友可以參考下2021-09-09
JavaScript中塊級(jí)作用域與函數(shù)作用域深入剖析
這篇文章主要為大家介紹了JavaScript中塊級(jí)作用域與函數(shù)作用域的實(shí)現(xiàn)原理深入剖析,2023-05-05

