Хорошо, я делаю скетч-приложение. Есть два холста: один - это фоновое изображение, а другой - оверлей, на котором пользователь может рисовать. Я пытаюсь реализовать функцию ластика, которая будет «стирать» любые пути, нарисованные пользователем на оверлее. Пока моя функция стирания выглядит так:
function eraseCanvas(bottomCtx, topCtx, x, y, strokeWidth) {
var bottomPixels = bottomCtx.getImageData(x, y, strokeWidth, strokeWidth);
var topPixels = topCtx.getImageData(x, y, strokeWidth, strokeWidth);
for (var i = 0; i < topPixels.data.length; i += 4) {
topPixels.data[i] = bottomPixels.data[i];
topPixels.data[i + 1] = bottomPixels.data[i + 1];
topPixels.data[i + 2] = bottomPixels.data[i + 2];
topPixels.data[i + 3] = bottomPixels.data[i + 3];
}
topCtx.putImageData(topPixels, x, y);
}
По сути, я пытаюсь стереть пиксели наложения, переписав их, используя пиксели фона, но это не работает. Почему?



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


Не могли бы вы упростить свой метод, скопировав блок пикселей из нижнего контекста непосредственно в верхний контекст, используя следующие аргументы dirtyWidth и dirtyHeight?
function eraseCanvas(bottomCtx, topCtx, x, y, strokeWidth) {
var bottomPixels = bottomCtx.getImageData(x, y, strokeWidth, strokeWidth);
// Directly draw bottomPixels from bottomCtx into topCtx, at the
// x,y coordinates, with 0,0 offset, between dimensions of
// strokeWidth x strongWidth
topCtx.putImageData(bottomPixels, x, y, 0, 0, strokeWidth, strokeWidth);
}
Документация MDN для putImageData предлагает дополнительную информацию об аргументах dirtyWidth и dirtyHeight, о которых я говорю.
Я обнаружил, что моя функция также работает правильно, я просто продолжал перерисовывать путь, как идиот, после этого, однако вы показали мне гораздо более чистый способ кодирования моей функции, так что спасибо.