【发布时间】:2021-05-27 23:14:48
【问题描述】:
我正在设置一个画布,然后在该画布中绘制一个图像,然后调用canvas.toBlob(function(blob)...),但我发现toBlob 中的blob 参数有时是null。
为什么会这样?我应该在drawImage 之后等待什么吗(即使在 sn-p 中 - 你可以看到我在等待图像加载后再继续)?
//--------------------------------------------------
function doImageFileInsert(fileinput) {
var newImg = document.createElement('img');
var img = fileinput.files[0];
let reader = new FileReader();
reader.onload = (e) => {
let base64 = e.target.result;
newImg.src = base64;
doTest(newImg);
};
reader.readAsDataURL(img);
fileinput.value = ''; // reset ready for another file
}
//--------------------------------------------------
function doTest(imgElem) {
console.log('doTest');
var canvas = document.createElement("canvas");
var w = imgElem.width;
var h = imgElem.height;
canvas.width = w;
canvas.height = h;
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(imgElem, 0, 0, w, h);
canvas.toBlob(function(blob) {
if (blob) {
console.log('blob is good');
} else {
console.log('blob is null');
alert('blob is null');
}
}, 'image/jpeg', 0.9);
}
canvas, div {
border:solid 1px grey;
padding:10px;
margin:5px;
border-radius:9px;
}
img {
width:100%;
height:auto;
}
<input type='file' value='Add' onChange='doImageFileInsert(this)'>
也可通过https://jsfiddle.net/Abeeee/rtwcge5h/24/ 获得。
如果您通过选择文件按钮添加图像的次数足够多,那么您就会遇到问题(alert('blob is null'))。
【问题讨论】:
-
How do I ask a good question?:在问题本身中包含minimal reproducible example,而不仅仅是摘录和指向外部资源的链接(可能无法访问或更改其内容)无论出于何种原因)。
-
根据specification,在这种情况下只有一个步骤可能会出现问题:“如果
result是_non-null,则将结果设置为@ 987654325@ with type and quality if given"_ + "如果在创建图像文件期间发生错误(例如内部编码器错误),则序列化的结果是null。” -
@Andreas 您错过了第 3 步,这是在 OP 的情况下未设置结果的地方(因为他们的画布是 0x0px)。
-
@Kaiido 不,我没有错过那一步,但我错过了 OP 只等待
FileReader而不是Image:/ -
@Andreas 那么,为什么说“只有一步……”呢?显然至少有两个。
标签: javascript canvas