Невозможно изменить холст imageData

Я столкнулся с ошибкой в ​​моем сценарии, которую я не понимаю. Я пытаюсь изменить холст imageData после изменения его данных. данные - это Int32Array

var clampedArray = new Uint8ClampedArray(data);
var newImgData=ctx.createImageData( WIDTH, HEIGHT);
newImgData.data = clampedArray;
console.log(newImgData.data, clampedArray);
ctx.putImageData(newImgData,0 ,0);

Этот console.log() возвращает:

 Uint8ClampedArray { 0=0, 1=0, 2=0, plus...} Uint8ClampedArray { 0=37, 1=54, 2=18, plus...}

Таким образом, newImageData.data не изменяется этой строкой:

newImgData.data = clampedArray;

Что за черт? я должен что-то пропустить, но что?

3 ответа

Решение

Правильный метод установки новых данных изображения - использовать метод set():

newImgData.data.set(clampedArray);

Обмен imageData.data с другим массивом всегда был проблематичным - возможно, из-за скрытых междоменных мер безопасности, встроенных в canvas.

Более надежным является копирование каждого нового элемента данных в массив imageData.data:

http://jsfiddle.net/m1erickson/s9DA4/

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var WIDTH=canvas.width;
    var HEIGHT=canvas.height;

    var data=[];
    for(var i=0;i<WIDTH*HEIGHT;i++){
        data=data.concat([0,255,0,255]);
    }

    var newImgData=ctx.createImageData(WIDTH,HEIGHT);
    for(var i=0;i<newImgData.data.length;i+=4){
        newImgData.data[i+0]=data[i+0];
        newImgData.data[i+1]=data[i+1];
        newImgData.data[i+2]=data[i+2];
        newImgData.data[i+3]=data[i+3];
    }

    ctx.putImageData(newImgData,0 ,0);

Вы можете опустить Uint8ClampedArray если ваш массив использует числа - JS автоматически преобразует его в 0-255 целых чисел, например data=[10.5,1000,-10,4] -> [10,255,0,4] так что вы можете просто написать:

newImgData.data.set(data);
Другие вопросы по тегам