У меня есть изображение в Canvas.
const canvas = document.createElement('canvas')
canvas.width = 640
canvas.height = 480
const context = canvas.getContext('2d')
element.appendChild(canvas)
const imageData = context.createImageData(640, 480)
imageData.data.set(new Uint8ClampedArray(data.frame))
context.putImageData(imageData, 0, 0)
Я получаю данные (высота, ширина, x, y). Я хочу вырезать изображение из холста по этим данным и сохранить его как blob-файл. Как я могу это сделать?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваш вопрос не ясен. Пример кода не соответствует описанию проблемы. Поскольку пример кода не работает (неопределенная переменная data), я могу только пойти по описанию проблемы.
I receive data (height, width, x, y). I want to cut an image from the canvas according to this data and save it as a blob-file. How can I do this?
Вырезать прямоугольную область из холста
function cutArea(fromImage, x, y, width, height) {
const cut = document.createElement("canvas");
cut.width = width;
cut.height = height;
const ctx = cut.getContext("2d");
ctx.drawImage(fromImage, -x, -y);
return cut;
}
Вы должны использовать offscreenCanvas, но поддержка ограничена, поэтому добавьте его, если вы знаете, каковы ваши цели. Создание выреза Canvas за кадром
function cutArea(fromImage, x, y, width, height) {
const cut = new OffscreenCanvas(width, height);
const ctx = cut.getContext("2d");
ctx.drawImage(fromImage, -x, -y);
return cut;
}
Примечание
fromImage может быть любым допустимым источником изображения, включая холст.width и height должны быть > 0, иначе функции выдадут ошибку.Чтобы загрузить вырезку в локальное хранилище в виде загруженного файла изображения "image/png". Примечание. Имя файла может быть изменено пользователем при загрузке. Тип изображения по умолчанию png. Невозможно узнать, прошла ли загрузка успешно.
function downloadCut(cut, name) {
const a = document.createElement("a");
a.download = name + ".png";
const download = blob => {
const url = a.href = URL.createObjectURL(blob);
a.dispatchEvent(new MouseEvent("click", {view: window, bubbles: true, cancelable: true}));
setTimeout(() => URL.revokeObjectURL(url), 1000); // clean up
}
if (cut instanceof OffscreenCanvas) { cut.convertToBlob().then(download) }
else { canvas.toBlob(download) }
}
Возможный дубликат stackoverflow.com/questions/26015497/… (по крайней мере, для вырезанной части; как получить это пятно после этого, вы должны исследовать сами).