javascript - Fabric.js : How to apply filter to entire canvas?

标签 javascript svg fabricjs

虽然我已经见过几种将滤镜应用于图像的方法,但我还没有看到任何将织物滤镜应用于整个 Canvas 的方法。

图像滤镜功能示例 来自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);
});

我想传入整个 Canvas 元素和内部的所有形状,并将过滤器应用于所有元素。

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

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

最佳答案

最终必须将 Canvas 转换为图像,然后从 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();

}

关于javascript - Fabric.js : How to apply filter to entire canvas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15975579/

相关文章:

javascript - 使用单个 URL 创建多页面设计

javascript - 无法使用 Highcharts 创建折线图 - Vue.js

c# - 以编程方式设置折线点(C#、vvvv/SVG-Library)

css - 如何使用 css 在悬停时将浮雕样式放在 SVG 元素上

javascript - fabric.js - 如何将织物图像对象推送到数组中?

javascript - Fabricjs - setBackgroundImage 为空 URL 导致 _setWidthHeight 中出现空引用错误

javascript - Bootstrap datetimepicker - 不会显示日历或格式化日期

qt - 为什么 Qt 不断打印 "couldn' t create image from"for SVG?

javascript - Fabric js 从缺少属性的 url 加载 svg

javascript - 是否有支持在服务器和客户端上共享 View 的 .Net MVC 解决方案?