私は現在、汚れやぼかしツールのためにピクセルデータにアクセスし、FirefoxのHTML5 Canvas APIで厄介な問題にぶつかってしまう小さな描画アプリケーションを作成しています。明らかに、仕様で定義されているgetImageDataは実装されていません。 spec specifically says "...キャンバスの外側にあるピクセルは透明な黒として返さなければなりません。"Firefoxの境界でgetImageDataを処理する方法は?
FFでは発生しません(FF 3.6および4ベータ9でテスト済み)。その代わりに、このようなエラーを与える:これはChromeでうまく動作するように表示されていることを12
注:無効または不正な文字列が「コード」に指定されました。
これは、この制限を回避するためにいくつかの特別なコードを実装する必要があることを意味します。
getImageDataAround: function(p, r) {
p = this._toAbsolute(p);
r = this._toAbsolute(r);
p = p.sub(r);
var d = r * 2;
var width = d;
var height = d;
// XXX: FF hack
if(navigator.userAgent.indexOf('Firefox') != -1) {
if(p.x < 0) {
width += p.x;
p.x = 0;
}
if(p.y < 0) {
height += p.y;
p.y = 0;
}
var x2 = p.x + width;
if(x2 >= this.width) {
width = d - (x2 - this.width);
}
var y2 = p.y + height;
if(y2 >= this.height) {
height = d - (y2 - this.height);
}
if((width != d) || (height != d)) {
// XXX: not ideal but at least this won't give any
// errors
return this.ctx.createImageData(d, d);
}
}
return this.ctx.getImageData(p.x, p.y, width, height);
},
私は空のピクセルの束を呼び出し元に戻すので、これはクールではありません。スペックのように結果を返すのがより良い方法です。
ただ、コードを明確にするには、実際のコンテキストをラップし、いくつかの追加機能(相対COORDSなど)を提供し、コンテキストAPIの一部です。おそらくthis.widthなどがどこから来たのか分かります。
これは面倒なXXXの部分です。 ImageDataを返すためには、仕様に合った方法が必要です。これを行う方法に関するアイデアは大歓迎です。 :)
うん...それは重宝します。私は他の方法はないと思う...彼らがまだそれを修正していないのは残念だ(バグ報告は2007年だ!)。私はいくつかの他のアイデアを得るためにこの質問をしばらく開いておくつもりです。何も来なければ、私はあなたの答えを受け入れるでしょう。 :)スニッフィングについての良い点! –