Я думаю, что есть несколько способов ...
Перерисовать все после нажатия кнопки
Это просто, но не очень эффективно.
Перерисовать только измененную часть
drawImage с 9 аргументами, чтобы перерисовать только измененную часть фонового изображения, затем перерисовать черный текст поверх.
Сохранить данные изображения перед щелчком и затем восстановить его
При этом используется getImageDataи putImageData 2D-контекста.(Не уверен, что он широко реализован, хотя.)
Вот спецификация:
ImageData getImageData(in double sx, in double sy, in double sw, in double sh);
void putImageData(in ImageData imagedata, in double dx, in double dy, in optional double dirtyX, in double dirtyY, in double dirtyWidth, in double dirtyHeight);
Так, например, если измененная часть находится в прямоугольнике от (20,30) до (180,70) пикселей, просто сделайте:
var ctx = canvas.getContext("2d");
var saved_rect = ctx.getImageData(20, 30, 160, 40);
// highlight the image part ...
// restore the altered part
ctx.putImageData(saved_rect, 20, 30);
Используйте два наложенных холста
Второй холст, расположенный над первым, будет содержать красный прямоугольник и белый текст и будет очищен, когдаВы хотите «восстановить» исходное изображение.