【发布时间】:2019-03-25 15:09:38
【问题描述】:
我有一个 600 x 400 像素的画布,它返回一个数据长度为 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 它似乎不起作用,小画布没有调整大小,但只是裁剪 https://codepen.io/bobiblazeski/full/drrQoB
【问题讨论】:
-
你有没有做过任何研究试图自己找到解决方案?
-
只使用生成的图像数据并将其绘制在较小的画布上? developer.mozilla.org/en-US/docs/Web/API/…
-
不创建额外元素就不能直接转换吗?
-
@sean 该解决方案通常建议使用离屏画布,我不确定我得到的是新的 ImageData 还是旧图像数据的一部分。