我想在代码中创建一个新的 ImageData 对象。如果我有一个Uint8ClampedArray
想要制作图像对象的对象,那么最好的方法是什么?
我想我可以制作一个新的 canvas 元素,提取它的 ImageData 并覆盖它的 data 属性,但这似乎是一种错误的方法。
如果我可以直接使用 ImageData 构造函数,那就太好了,但我不知道该怎么做。
我想在代码中创建一个新的 ImageData 对象。如果我有一个Uint8ClampedArray
想要制作图像对象的对象,那么最好的方法是什么?
我想我可以制作一个新的 canvas 元素,提取它的 ImageData 并覆盖它的 data 属性,但这似乎是一种错误的方法。
如果我可以直接使用 ImageData 构造函数,那就太好了,但我不知道该怎么做。
这是一个有趣的问题......你不能只创建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
中所述,属性是只读的。
所以我认为唯一的方法是通过迭代创建对象并设置数据属性:
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);
最新版本的 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);
构造ImageData
函数终于在 Chrome 和 Firefox 中可用(参见mdn上的兼容性表)。有两种形式:
var imageData = new ImageData(width, height);
如果你想用一个UInt8ClampedArray
对象构建一个实例data
:
var imageData = new ImageData(data, width, height); // height is optional
出于兼容性原因,最好createImageData
通过画布 2D 上下文使用,如其他答案所示。
有createImageData()
方法。但为此,您需要现有画布的上下文。
var myImageData = context.createImageData(cssWidth, cssHeight);
请参阅此处了解更多信息。