首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义图像筛选器中超过的最大调用堆栈大小

自定义图像筛选器中超过的最大调用堆栈大小
EN

Stack Overflow用户
提问于 2015-05-07 22:45:56
回答 1查看 918关注 0票数 1

我正在寻找一种在法布里奇画布中用图像模式填充图像的方法,因为没有内置的图像滤波器来这样做。虽然我的代码仍然处于早期版本,但基本上它应该工作(不幸的是它不能);所有的窃听工作都是由applyTo方法完成的,在这里我加载了一个图像,然后用一个模式填充隐藏的画布。我注意到有一个函数(source)是无限递归的:

代码语言:javascript
复制
var pattern = new fabric.Pattern({
   source: function () {
       fhc.setDimensions({
           width: smile.getWidth() + 5,
           height: smile.getHeight() + 5,
       });
       return fhc.getElement();
   },
   repeat: 'repeat'
});

我准备了一个关于JSFiddle的演示

有人能帮我理解如何解决这个问题吗?

代码语言:javascript
复制
(function (global) {

   'use strict';

   var fabric = global.fabric || (global.fabric = {}),
       extend = fabric.util.object.extend;

   fabric.Image.filters.ImagePatternEffect = fabric.util.createClass(fabric.Image.filters.BaseFilter, {

       type: 'ImagePatternEffect',

       initialize: function (options) {
           options = options || {};

           this.img = options.img;
       },

       applyTo: function (canvasEl) {

           var w = canvasEl.width;
           var h = canvasEl.height;
           var hc = document.createElement('canvas');

           fabric.Image.fromURL('http://i.imgur.com/0Ks0mlY.png', function (smile) {
               debugger;
               hc.setAttribute('width', w);
               hc.setAttribute('height', h);

               var fhc = new fabric.StaticCanvas(hc);
               fhc.add(smile);
               var pattern = new fabric.Pattern({
                   source: function () {
                       fhc.setDimensions({
                           width: smile.getWidth() + 5,
                           height: smile.getHeight() + 5,
                       });
                       return fhc.getElement();
                   },
                   repeat: 'repeat'
               });
               var rect = new fabric.Rect({
                   fill: pattern,
                   width: w,
                   height: h
               });

               fhc.add(rect);
               fhc.renderAll();

               var ifhcContext = fhc.getContext('2d');
               var fhcImageData = ifhcContext.getImageData(0, 0, fhc.width, fhc.height);
               var fhcData = fhcImageData.data;

               var context = canvasEl.getContext('2d'),
                   imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height),
                   data = imageData.data;

               for (var i = 0, n = data.length; i < n; i += 4) {
                   data[i] += fhcData[i];
                   data[i + 1] += fhcData[i + 1];
                   data[i + 2] += fhcData[i + 2];

               }

               context.putImageData(imageData, 0, 0);

           });

       },

       toObject: function () {
           return extend(this.callSuper('toObject'), {


           });
       }
   });

   fabric.Image.filters.ImagePatternEffect.fromObject = function (object) {
       return new fabric.Image.filters.ImagePatternEffect(object);
   };

})(typeof exports !== 'undefined' ? exports : this);


var canvas = new fabric.Canvas('c');


fabric.Image.fromURL('http://i.imgur.com/qaQ8jir.png', function (img) {
   var orImg = img;
   img.filters.push(new fabric.Image.filters.ImagePatternEffect({

       img: orImg,

   }));
   img.applyFilters(canvas.renderAll.bind(canvas));
   canvas.add(img.set({
       width: 300,
       height: 300,

   }));
}, {
   crossOrigin: ''
});
EN

回答 1

Stack Overflow用户

发布于 2015-05-08 05:47:41

我还在我的web应用程序上使用了模式图像,以便将它添加到对象上,并且它可以工作。

您所需要的只是这个函数函数loadPattern(url,seatObj),在这里,我传递希望每次添加模式的对象和图像(模式)链接。

下面是片段:

代码语言:javascript
复制
       function loadPattern(url, seatObj) {
    //i use the loadImage function to load the image and pass it to the fabric.Pattern constructor

                    fabric.util.loadImage(url, function (img) {
        //i change the fill property of the object to the
        //image that i want to load on it as a pattern

                        seatObj.fill = new fabric.Pattern({
                            source: img,
                            repeat: 'no-repeat'
                        });
//refresh canvas and watch your image pattern on the object
                        canvas.renderAll();
                    });
                }

希望这能帮上忙祝你好运

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30112915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档