После некоторой возни я нашел решение, используя этот ответ в качестве отправной точки.По сути, вы можете просто нарисовать больший холст на меньшем холсте, а затем получить из него ImageData.
const bigCanvas = document.getElementById("big");
const bigContext = bigCanvas.getContext("2d");
const smallContext = document.getElementById("small").getContext("2d");
smallContext.scale(0.5, 0.5);
smallContext.drawImage(bigCanvas, 0, 0);
const smallImageData = smallContext.getImageData(0, 0, bigCanvas.width, bigCanvas.height);
Вот кодовый код в качестве доказательства того, что полученные данные изображения представляют собой уменьшенную версиюисходный холст, а не просто фрагмент из него.
![Big Small Resized](https://i.stack.imgur.com/HtV6C.png)
Если вы хотите изменить размер в цикле, очистите холст назначения перед вызовом drawImage codepen .
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const bigCanvas = document.getElementById("big");
const bigContext = bigCanvas.getContext("2d");
const smallCanvas = document.getElementById("small");
const smallContext = smallCanvas.getContext("2d");
const otherCanvas = document.getElementById("other");
const otherContext = otherCanvas.getContext("2d");
function getImage(i) {
bigContext.clearRect(0, 0, bigCanvas.width, bigCanvas.height);
bigContext.fillRect(((i+0)%5)*100, 0, 100, 100);
bigContext.fillRect(((i+1)%5)*100, 100, 100, 100);
bigContext.fillRect(((i+2)%5)*100, 200, 100, 100);
bigContext.fillRect(((i+3)%5)*100, 100, 100, 100);
bigContext.fillRect(((i+4)%5)*100, 0, 100, 100);
bigContext.fillRect(((i+0)%5)*100, 200, 100, 100);
smallContext.clearRect(0, 0, smallCanvas.width, smallCanvas.height);
smallContext.drawImage(bigCanvas, 0, 0, smallCanvas.width, smallCanvas.height);
const smallImageData = smallContext.getImageData(0,0,
bigCanvas.width, bigCanvas.height);
otherContext.putImageData(smallImageData, 0, 0);
};
window.addEventListener("DOMContentLoaded", function() {
var i = 0;
setInterval(() => {
console.log(i);
getImage(i++);
}, 3000);
});