私は現在、スマッジツールとブラーツールのピクセルデータにアクセスする必要がある小さな描画アプリケーションを作成しており、FirefoxのHTML5CanvasAPIで厄介な問題にぶつかりました。どうやらそれは仕様で定義されているようにgetImageDataを完全に実装していません。仕様には、「...キャンバスの外側のピクセルは透明な黒として返される必要があります...」と具体的に記載されています。
これはFFでは発生しません(FF 3.6および4ベータ9でテスト済み)。代わりに、次のようなエラーが発生します:無効または不正な文字列が指定されました "コード:" 12
これはChromeで問題なく機能するように見えることに注意してください。
これは、この制限を回避するためにいくつかの追加コードを実装する必要があることを意味すると思います。次のコードを使用して、問題を回避することができました。
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);
},
空のピクセルの束を発信者に返すので、これはクールではありません。仕様と同じように結果を返す方がはるかに良いでしょう。
コードを明確にするために、実際のコンテキストをラップし、いくつかの追加機能(相対座標など)を提供するコンテキストAPIの一部です。これはおそらく、this.widthなどがどこから来ているのかを説明しています。
面倒なのはXXXの部分です。仕様に合ったImageDataを返す方法が必要です。これを行う方法についてのアイデアは大歓迎です。:)