В настоящее время я пишу небольшое приложение для рисования, которое нуждается в доступе к пиксельным данным для своих инструментов размытия и размытия и столкнулось с неприятной проблемой HTML5 Canvas API в Firefox. Очевидно, он не реализует getImageData, как определено в спецификации. Спецификация специально гласит:"... Пиксели вне холста должны возвращаться как прозрачный черный. ...".
Этого не происходит в FF (протестировано в FF 3.6 и 4 beta 9). Вместо этого он выдаст ошибку, такую как это: неверная или недопустимая строка была указана "code:" 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);
},
Это не круто, так как я возвращаю кучу пустых пикселей вызывающей стороне. Было бы намного лучше возвращать результаты, как в спецификации.
Просто для пояснения кода является частью Context API, который оборачивает реальный контекст и предоставляет некоторые дополнительные функции (относительные координаты и т. Д.). Это, вероятно, объясняет, откуда взялись такие вещи, как this.width и т. Д.
Это часть XXX, которая вызывает беспокойство. Мне просто нужен какой-то способ вернуть ImageData, который соответствует спецификации. Любые идеи о том, как это сделать, приветствуются. :)