如何独立创建一个新的ImageData对象?

时间:2012-11-29 13:03:55

标签: javascript canvas html5-canvas getimagedata

我想在代码中创建一个新的ImageData对象。如果我有一个Uint8ClampedArray我想制作一个图像对象,那么最好的方法是什么?

我想我可以创建一个新的canvas元素,提取它的ImageData并覆盖它的数据属性,但这似乎是一种错误的方法。

如果我可以直接使用ImageData构造函数,那会很棒,但我无法弄清楚如何使用。

4 个答案:

答案 0 :(得分:36)

这是一个有趣的问题......你不能只创建ImageData对象:

var test = new ImageData(); // TypeError: Illegal constructor

我也尝试过:

var imageData= context.createImageData(width, height);
imageData.data = mydata; // TypeError: Cannot assign to read only property 'data' of #<ImageData> 

但正如MDN data中所述,属性是readonly。

所以我认为唯一的方法是使用迭代创建对象和设置数据属性:

var canvas = document.createElement('canvas');
var imageData = canvas.getContext('2d').createImageData(width, height);
for(var i = 0; i < myData.length; i++){
    imageData.data[i] = myData[i];
}

<强>更新 我在ImageData的set属性中发现了data方法,因此解决方案非常简单:

var canvas = document.createElement('canvas');
var imageData = canvas.getContext('2d').createImageData(width, height);
imageData.data.set(myData);

答案 1 :(得分:7)

最新版本的Chrome和Firefox已经支持ImageData构造函数。您可以在MDN找到它的定义。

对于其他浏览器,您可以自己创建此构造函数:

function ImageData() {
    var i = 0;
    if(arguments[0] instanceof Uint8ClampedArray) {
        var data = arguments[i++];
    }
    var width = arguments[i++];
    var height = arguments[i];      

    var canvas = document.createElement('canvas');
    canvas.width = width;
    canvas.height = height;
    var ctx = canvas.getContext('2d');
    var imageData = ctx.createImageData(width, height);
    if(data) imageData.data.set(data);
    return imageData;
}

你可以像这样使用它:

var imgData1 = new ImageData(data, width, height);
var imgData2 = new ImageData(width, height);

答案 2 :(得分:1)

ImageData构造函数最终在Chrome和Firefox中可用(请参阅mdn上的兼容性表)。有两种形式:

var imageData = new ImageData(width, height);

如果您要使用UInt8ClampedArray对象data构建实例:

var imageData = new ImageData(data, width, height); // height is optional

出于兼容性原因,最好通过画布2D上下文使用createImageData,如其他答案所示。

答案 3 :(得分:0)

createImageData()方法。但为此,您需要现有画布的上下文。

var myImageData = context.createImageData(cssWidth, cssHeight);

有关详细信息,请参阅here