コードで新しい ImageData オブジェクトを作成したいと考えています。Uint8ClampedArray
画像オブジェクトを作成したい場合、それを行う最良の方法は何ですか?
新しいキャンバス要素を作成し、その ImageData を抽出してそのデータ属性を上書きすることもできると思いますが、それは間違ったアプローチのようです。
ImageData コンストラクターを直接使用できれば素晴らしいのですが、その方法がわかりません。
コードで新しい ImageData オブジェクトを作成したいと考えています。Uint8ClampedArray
画像オブジェクトを作成したい場合、それを行う最良の方法は何ですか?
新しいキャンバス要素を作成し、その ImageData を抽出してそのデータ属性を上書きすることもできると思いますが、それは間違ったアプローチのようです。
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];
}
更新:set
ImageData のプロパティでメソッド
を発見した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 の互換性テーブルを参照してください)。次の 2 つの形式があります。
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);
詳しくはこちらをご覧ください。