在导出包含遮罩的flash动画时,我不明白如何成功地使用抗锯齿剪贴蒙版。
这是我的例子:
全画布,带面具。 Chrome中超级脏:http://goo.gl/n8yB5h
一个漂亮的出口,有一张图片在面具内移动。 Chrome上超级干净: http://www.creaktif.com/lab/test4.html
我尝试了很多东西,包括绘制200%的画布然后缩小它,在我绘制蒙版时添加更多的点,但是无法在画布上获得干净的蒙版。
swiffy怎么样? 它只会让我发疯。
感谢。 :)
答案 0 :(得分:4)
您可以将剪切路径绘制到屏幕外的画布中,而不是使用clip()
,而是将其用作“遮罩”,或者更确切地说,使用alpha遮罩。
现在,您可以使用具有各种复合模式的蒙版来获得抗锯齿边缘。在要剪切的背景中绘制,设置复合模式(运算符)并绘制蒙版。根据操作员的不同,您可以切除中心或周围环境(destination-in
通常等同于使用clip()
)。
注意:下面的演示仅适用于Chrome / Opera,因为Firefox / IE已经对剪辑蒙版应用了抗锯齿 - 这是显示差异的快照:
var ctxC = document.getElementById("clip").getContext("2d");
var ctxM = document.getElementById("mask").getContext("2d");
var w = ctxC.canvas.width, h = ctxC.canvas.height;
var img = new Image();
img.onload = demo;
img.src = "http://i.imgur.com/s9ksOb1.jpg";
function demo() {
// define a clip path
ctxC.save();
createPath(ctxC);
ctxC.clip();
ctxC.drawImage(this, 0, 0, w, h);
ctxC.restore();
// create a "matte" / alpha mask
var matte = document.createElement("canvas"),
ctx = matte.getContext("2d");
matte.width = w;
matte.height = h;
// fill the path instead:
createPath(ctx);
ctx.fill(); // color doesn't matter, alpha does
// now use composition to "clip"
ctxM.drawImage(this, 0, 0, w, h); // draw image
ctxM.globalCompositeOperation = "destination-in"; // will keep bg where mask cover
ctxM.drawImage(matte, 0, 0);
ctxM.globalCompositeOperation = "source-over"; // default mode
// zoom some details:
zoom(ctxC);
zoom(ctxM);
}
function createPath(ctx) {
var r = 88;
ctx.beginPath();
ctx.moveTo(100 + r, 90);
ctx.arc(100,90,r, 0, 6.28);
}
function zoom(ctx) {
ctx.imageSmoothingEnabled =
ctx.webkitImageSmoothingEnabled =
ctx.mozImageSmoothingEnabled = false;
ctx.drawImage(ctx.canvas, 10, 10, 100, 100, 70,0, 400, 400);
}
html, body {margin:4px 0 0 4px;overflow:hidden}
canvas{background:#000;border:1px solid #000;margin:0 1px 0 0}
<canvas id="clip" height=180></canvas>
<canvas id="mask" height=180></canvas>