默认情况下,在多个画布上禁用imageSmoothingEnabled

时间:2014-02-25 02:58:10

标签: javascript canvas html5-canvas

我正在创建一个使用分层画布和精灵图像的基于浏览器的游戏,出于视觉和性能原因,我想默认禁用imageSmoothingEnabled。我的理解是imageSmoothingEnabled并非在所有浏览器中都可用,但有供应商前缀版本。我试图在我的所有画布(尽可能多的浏览器中)中找到一种优雅的方法来禁用此属性。到目前为止,这是我的方法:

context1.imageSmoothingEnabled = false;
context1.mozImageSmoothingEnabled = false;
context1.oImageSmoothingEnabled = false;
context1.webkitImageSmoothingEnabled = false;

context2.imageSmoothingEnabled = false;
context2.mozImageSmoothingEnabled = false;
context2.oImageSmoothingEnabled = false;
context2.webkitImageSmoothingEnabled = false;

context3.imageSmoothingEnabled = false;
context3.mozImageSmoothingEnabled = false;
context3.oImageSmoothingEnabled = false;
context3.webkitImageSmoothingEnabled = false;
//etc...

有更优雅的方法吗?在实际创建每个画布上下文之前,是否可以将上下文的API更改为false?

2 个答案:

答案 0 :(得分:6)

是的,你有一个更清洁的方法:因为你总是在画布上使用getContext('2d')得到一个上下文,你可以注入getContext,这样它就可以在返回之前进行任何类似的设置。上下文。

以下代码成功地将所有上下文的平滑设置为false:

(很明显,应该在调用getContext之前运行)。

// save old getContext
var oldgetContext = HTMLCanvasElement.prototype.getContext ;

// get a context, set it to smoothed if it was a 2d context, and return it.
function getSmoothContext(contextType) {
  var resCtx = oldgetContext.apply(this, arguments);
  if (contextType == '2d') {
   setToFalse(resCtx, 'imageSmoothingEnabled');
   setToFalse(resCtx, 'mozImageSmoothingEnabled');
   setToFalse(resCtx, 'oImageSmoothingEnabled');
   setToFalse(resCtx, 'webkitImageSmoothingEnabled');  
  }
  return resCtx ;  
}

function setToFalse(obj, prop) { if ( obj[prop] !== undefined ) obj[prop] = false; }

// inject new smoothed getContext
HTMLCanvasElement.prototype.getContext = getSmoothContext ;

Rq,您可以在'your'getContext中执行任何操作。我使用它来复制画布在上下文中的宽度,高度,以便在没有DOM访问的情况下将它们放在手边,等等。

答案 1 :(得分:1)

您可以将这些放入以下方法:

function imageSmoothingEnabled(ctx, state) {
    ctx.mozImageSmoothingEnabled = state;
    ctx.oImageSmoothingEnabled = state;
    ctx.webkitImageSmoothingEnabled = state;
    ctx.imageSmoothingEnabled = state;
}

然后调用每个上下文:

imageSmoothingEnabled(context1, false);
imageSmoothingEnabled(context2, false);
imageSmoothingEnabled(context3, false);

由于这些属性不能简单地改变它们的默认值。这里的方法很干净 - 首先通过检查属性的存在可以更清晰:

if (typeof ctx.webkitImageSmoothingEnabled !== 'undefined')
    ctx.webkitImageSmoothingEnabled = state;