【问题标题】:Fabric.js: How to apply filter to entire canvas?Fabric.js:如何将过滤器应用于整个画布?
【发布时间】:2013-04-05 05:31:01
【问题描述】:

虽然我已经看到了几种将过滤器应用于图像的方法,但我还没有看到任何可以将织物过滤器应用于整个画布的方法。

图像过滤功能示例 来自http://fabricjs.com/fabric-intro-part-2/

fabric.Image.fromURL('pug.jpg', function(img) {

  // add filter
  img.filters.push(new fabric.Image.filters.Grayscale());

  // apply filters and re-render canvas when done
  img.applyFilters(canvas.renderAll.bind(canvas));

  // add image onto canvas
  canvas.add(img);
});

我想传入整个画布元素和里面的所有形状并将过滤器应用于所有。

是否需要展平画布,将其转换为图像,然后应用滤镜?用户可以在展平和应用之后进行更改,画布必须解耦回“图层”,以便用户可以继续编辑。

灰度过滤器的文档。 http://fabricjs.com/docs/symbols/fabric.Image.filters.Grayscale.html

【问题讨论】:

    标签: javascript svg fabricjs


    【解决方案1】:

    最终不得不将画布转换为图像,然后从 html 中的隐藏图像中添加它。

    <img class="test-image" src="" style="display:none;" /> 在标记中

    var addFilterToCanvas = function (name) {
    
        // remove controls on filter click, have to do it before it creates the image to
        // get rid of shape controls
        canvas.deactivateAll()
    
        var overlayImageUrl = canvas.toDataURL('png');
        $('.test-image').attr('src', overlayImageUrl);
        var filterImageUrl = $('.test-image').attr('src');
    
    
                fabric.Image.fromURL(filterImageUrl, function(img) {
    
                // add filter
                switch (name) {
                    case 'Grayscale':
                        img.filters.push(new fabric.Image.filters.Grayscale());
                    break;
                    case 'Sepia':
                        img.filters.push(new fabric.Image.filters.Sepia());
                    break;
                    case 'Sepia2':
                        img.filters.push(new fabric.Image.filters.Sepia2());
                    break;
                    case 'Invert':
                        img.filters.push(new fabric.Image.filters.Invert());
                    break;
                }
    
                    // apply filters and re-render canvas when done
                    img.applyFilters(canvas.renderAll.bind(canvas));
    
                    // center image 
                    img.top = canvas.getHeight() / 2;
                    img.left = canvas.getWidth() / 2;
    
                    // add image onto canvas
                    canvas.add(img);
                });
    
            // remove controls on after filter applied to get rid of
            // new image resize controls
            canvas.deactivateAll().renderAll();
    
    }
    

    【讨论】:

    • 我使用了这个功能,但是画布是空的。我在 DevTool 中进行了检查,Fabric 添加了带有“upper-canvas”类的新画布,它也是空的!我不知道为什么?我修改顶部函数,而不是使用canvas 作为全局变量,我使用新的 - var canvas = new fabric.Canvas('canvas_DOM_id')
    猜你喜欢
    • 2019-03-09
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2015-03-11
    • 2011-06-06
    • 2015-08-31
    • 2010-09-26
    相关资源
    最近更新 更多