gpt4 book ai didi

javascript - 在浏览器中调整 ImageData 大小的快速方法?

转载 作者:行者123 更新时间:2023-12-02 23:56:50 24 4
gpt4 key购买 nike

我有一个 600 x 400 像素的 Canvas ,它返回数据长度为 960,000 (600*400*4) 的 ImageData。有没有办法将宽度和高度缩小10倍,我想得到一个数据长度为9600(60*40*4)的ImageData。

const canvas = document.getElementsByTagName("canvas")[0]
var ctx = canvas.getContext("2d");
const origImageData = ctx.getImageData(0, 0, canvas.width, canvas.height)
origImageData
// => ImageData {data: Uint8ClampedArray(960000), width: 600, height: 400}
const smallImageData = downscale(origImageData, 60, 40);
smallImageData
// => ImageData {data: Uint8ClampedArray(9600), width: 60, height: 40}

我需要生成的 ImageData.data 数组进行进一步操作。该方法将在循环中调用,因此如果速度快的话就好了。

编辑这是建议的方法,我不确定它是否正确:

var canvas2 = document.createElement('canvas');
canvas2.width = canvas.width/10;
canvas2.height = canvas.height/10;
var ctx2 = canvas2.getContext('2d');
// Step that I found confusing
// Is the new image data being created?
ctx2.putImageData(origImageData, 0, 0);
// Which image data I'm getting here resized or part of original ?
ctx2.getImageData(0,0, canvas2.width, canvas2.height)

编辑2它似乎不起作用,小 Canvas 没有调整大小,而只是裁剪了 https://codepen.io/bobiblazeski/full/drrQoB

最佳答案

经过一番摆弄后,我找到了使用 this 的解决方案答案作为起点。基本上,您可以将较大的 Canvas 绘制到较小的 Canvas 中,然后从中获取 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);

这是一个codepen作为检索到的图像数据是缩小版本的证据原始 Canvas 的一部分,而不仅仅是其中的裁剪。

Big Small Resized

如果你想循环调整大小,请在调用drawImage之前清除目标 Canvas 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);
});

关于javascript - 在浏览器中调整 ImageData 大小的快速方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55340888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com