我是从画布创建PNG文件,但在我想将画布显示为img元素之前,使用blob作为img的src。到目前为止我尝试了什么:
canvas = document.getElementById("canvas");
//Get data from canvas
img_b64 = canvas.toDataURL('image/png');
//Create PNG
png = img_b64.split(',')[1];
//Create new img
img = document.createElement("img");
img.src = img_b64;
//Append img to document
//Save png
这样可行,但是我想要一个blob作为img的src,而不是img_b64
,这样:
//Create blob from new PNG
blob = new Blob([window.atob(png)], { type: 'image/png', encoding: 'utf-8' });
//Create new img with blob as src
img = document.createElement("img");
img.src = URL.createObjectURL(blob);
//Append img to document
//Save png
上面的代码只显示了一个空的img。有没有办法做到这一点,还是我必须首先创建一个png文件,然后为它创建一个blob?
答案 0 :(得分:4)
我刚使用这个问题的答案找到了一个解决方案:Convert Data URI to File then append to FormData。使用dataURItoBlob
函数我的代码是:
canvas = document.getElementById("canvas");
//Get data from canvas
img_b64 = canvas.toDataURL('image/png');
//Create blob from DataURL
blob = dataURItoBlob(img_b64)
img = document.createElement("img");
img.src = URL.createObjectURL(blob);
//Insert image
dataURItoBlob功能:
function dataURItoBlob(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0)
byteString = atob(dataURI.split(',')[1]);
else
byteString = unescape(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
// write the bytes of the string to a typed array
var ia = new Uint8Array(byteString.length);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], {type:mimeString});
}
答案 1 :(得分:2)
使用toBlob,应该可以从IE> = 10轻松解决这个问题。
const img = document.createElement("img");
canvas.toBlob((blob) => {
img.src = URL.createObjectURL(blob);
});