【问题标题】:Kinetic js 5.1 globalCompositeOperation how toKinetic js 5.1 globalCompositeOperation 如何
【发布时间】:2014-07-22 14:05:24
【问题描述】:

我对 Kinetic JS 还很陌生。 我试图让一些 .globalCompositeOperation 在我拥有的项目的两个部分中工作,我尝试了几种可以在这里找到的解决方案,使用“drawFunc”和“sceneFunc”等......但到目前为止还没有运气。

项目的一部分我试图让“目的地”在 kinetic.Sprite 上工作:

var strokesSprite = new Kinetic.Sprite({
                        image: e,
                        animation: 'intro',
                        animations: {
                            'intro': config.spritestrokes.frames
                        },
                        frameRate: 7,
                        frameIndex: 0,
                        sceneFunc: function (ctx) {
                            ctx.save();
                            ctx.globalCompositeOperation = 'destination-out';
                            ctx.restore();
                        }

    var strokes = new Kinetic.Layer({
                        width: 1280,
                        height: 1280,
                        x: stage.getWidth() / 2,
                        y: stage.getHeight() / 2,
                        offset: {
                            x: 1280 / 2,
                            y: 1280 / 2
                        }
                    });
                    strokes.add(backgroundPainted);
                    strokes.add(strokesSprite);
                    strokes.draw();
                    stage.add(strokes);

"backgroundPainted" 是 Kinetic.Image

不幸的是,我在这里得到的只是精灵图层在“backgroundPainted”之上进行动画处理,但没有应用复合操作:(。

对于我的第二个实例,它实际上非常相似,我只有 2 个图层,都在里面有形状,添加到舞台上。我将相同的“sceneFunc”应用到顶部的图层,然后绘制它们。 两个图层都显示,没有应用合成。 :(

关于我应该看什么的任何指示?我看到例如“drawFunc”最近已更改为“sceneFunc”,也许还有其他一些变化,因为我已经尝试了几乎所有可以在堆栈上找到的示例。

谢谢

【问题讨论】:

    标签: javascript canvas kineticjs composite globalcompositeoperation


    【解决方案1】:

    KineticJS 不支持globalCompositeOperation

    KineticJS 为您提供了一个围绕 html5 画布上下文的包装器,但该包装器是不包含 context.globalCompositeOperation 属性的上下文的子集。

    解决方法

    您可以创建画布元素(无需将其附加到页面)。在屏幕外的画布上进行合成。要在 KineticJS 中显示该画布,只需创建一个 Kinetic.Image ,其 image 属性指向屏幕外的画布:

    var myOffscreenCanvas=document.createElement("canvas");
    
    ... do compositing ...
    
    // this Kinetic.Image will display myOffscreenCanvas
    
    var myCompositedImage = new Kinetic.Image({
    
        image:myOffscreenCanvas,
    
        ...
    
    });
    

    【讨论】:

    • 感谢您的回答,我的性能问题是我的对象是 Kinetic 形式,所以我必须创建一个屏幕外画布,使用“layerAB.getCanvas”绘制我的 Kinetic 对象(drawImage) ()._canvas",然后做globalComposite,然后把最终的结果重绘回我的图层?是否可以绘制到尚未添加到舞台的图层?我已经尝试过,然后在其他地方绘制该图层的画布,但如果我的“屏幕外”画布未添加到舞台,则不会绘制任何内容。
    • 您可以使用myNode.toImage 将您的动力学节点转换为图像,然后使用drawImage 在画布上绘制该图像。 (同上一整层或整个阶段)。从屏幕外画布绘制到 Kinetic.Image 时不会影响材料性能。原因是画布维护了一个像素数组,该数组只是被 blitted(批量复制)到任何基于像素的图像(如 Kinetic.Image)上。至于如何将画布放入 Kinetic.Shape:您可以仅使用 drawImage(offscreenCanvas,x,y)。可以使用画布代替 imageObj。
    • 谢谢markE,我现在正在研究这个,我认为它是缺少的链接:)。
    • 我在尝试这个时似乎遇到了错误...` var tWidth = Brush.getWidth(); var tHeight = Brush.getHeight(); Brush.toImage({宽度:tWidth,高度:tHeight,x:0,y:0,回调:函数(e){...}`...其抛出:未捕获的TypeError:无法读取属性'_applyTransform'为null kinetic-v5.1.0.min.js:1419Kinetic.Util.addMethods.drawScene kinetic-v5.1.0.min.js:1419Kinetic.Util.addMethods.toDataURL kinetic-v5.1.0.min.js:685Kinetic.Util.addMethods。 toImage
    • 好的,这是因为我没有先将形状添加到舞台上的图层。不幸的是,性能很低,我猜是因为等待回调,这基本上就像两层之间的克隆画笔,当你用指针移动时,顶部的图层“被删除”,你会看到下面的图层。通过使用原始画布,我得出结论,使用“destination-out”是性能最佳的选项,但也热衷于其他选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多