Javascript ImageData типизировал массив для чтения всего пикселя? - программирование
Подтвердить что ты не робот

Javascript ImageData типизировал массив для чтения всего пикселя?

Итак, есть много примеров того, как написать весь пиксель из представления Uint32Array объекта ImageData. Но возможно ли читать весь пиксель без увеличения счетчика 4 раза? Из hacks.mozilla.org запись пиков rgba выглядит как this.

var imageData = ctx.getImageData(0, 0, canvasWidth, canvasHeight);

var buf = new ArrayBuffer(imageData.data.length);
var buf8 = new Uint8ClampedArray(buf);
var data = new Uint32Array(buf);

for (var y = 0; y < canvasHeight; ++y) {
    for (var x = 0; x < canvasWidth; ++x) {
        var value = x * y & 0xff;

        data[y * canvasWidth + x] =
            (255   << 24) |    // alpha
            (value << 16) |    // blue
            (value <<  8) |    // green
             value;            // red
    }
}

imageData.data.set(buf8);

ctx.putImageData(imageData, 0, 0);

Но как я могу прочитать весь пиксель из одного смещения в 32-битном представлении ImageData? Здесь то, что я нахожу в замешательстве, не должно быть ниже buf32 длиной 256/4 = 64?

// 8x8 image
var imgd = ctx.getImageData(0, 0, canvasWidth, canvasHeight),
    buf32 = new Uint32Array(imgd.data);

console.log(imgd.data.length);  // 256
console.log(buf32.length);      // 256  shouldn't this be 256/4 ?

спасибо!

4b9b3361

Ответ 1

вычислил это, мне нужно передать сам буфер в конструктор Uint32Array, а не другой BufferView.

var buf32 = new Uint32Array(imgd.data.buffer);
console.log(buf32.length)  // 64 yay!

Ответ 2

длина буфера увеличивается в четыре раза из-за отображения на сетчатке, вам нужно записать pixelDensity(1); чтобы избежать этого