Это ошибка Chrome с контекстом bitmaprenderer ...
По какой-либо причине результатом HTMLCanvasElement.toBlob()
и HTMLCanvasElement.toDataURL()
будут полностью прозрачные изображения ...
Они не учитывают текущий активный растровый буфер, который отображается в HTMLCanvasElement.
Это можно продемонстрировать, добавив холст к документу:
fetch('https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png')
.then(r => r.blob())
.then(b=>createImageBitmap(b, 120,120,120,120))
.then(img => {
return new Promise(res => {
// create a canvas
const canvas = document.createElement('canvas');
// resize it to the size of our ImageBitmap
canvas.width = img.width;
canvas.height = img.height;
document.body.append(canvas);
// transfer on the bitmarenderer context
canvas.getContext('bitmaprenderer')
.transferFromImageBitmap(img);
// get it back as a Blob
canvas.toBlob(res);
});
})
.then(blob => {
var img = document.body.appendChild(new Image());
img.src = URL.createObjectURL(blob);
});
img {
border: solid red;
}
canvas {
border: solid green;
}
Вы можете пометить вопрос , чтобы он получил более высокий приоритет, и на данный момент вы можете захотеть вернуться к 2dContext иего память истощает drawImage () метод ...
fetch('https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png')
.then(r => r.blob())
.then(b=>createImageBitmap(b, 120,120,120,120))
.then(img => {
return new Promise(res => {
// create a canvas
const canvas = document.createElement('canvas');
// resize it to the size of our ImageBitmap
canvas.width = img.width;
canvas.height = img.height;
document.body.append(canvas);
// draw on a 2d context
canvas.getContext('2d')
.drawImage(img,0,0);
// get it back as a Blob
canvas.toBlob(res);
});
})
.then(blob => {
var img = document.body.appendChild(new Image());
img.src = URL.createObjectURL(blob);
});
img {
border: solid red;
}
canvas {
border: solid green;
}