【问题标题】:Text color overlay in FabricJSFabricJS中的文本颜色叠加
【发布时间】:2014-11-30 02:12:09
【问题描述】:

我正在尝试在 FabricJS 中创建效果,其中我添加到画布中的某些文本的颜色由纹理决定。应该很容易,但是当我将纹理应用为图案时,我无法计算出使其工作所需的比例、旋转等组合。在我看来,图案被“局部”应用于对象,因此 (0,0) 是对象的左上角坐标,而不是整个图像的坐标。

所以如果这是我的文本颜色纹理,

我在中间放了一些文字,我想要的效果是这样的:

我已经尝试过使用静态画布等各种方法,但我遇到了死胡同。请问有人可以帮忙吗?这是我目前的尝试:

var patternSourceCanvas = new fabric.StaticCanvas();

    oImg.setAngle(-angles[i]);

    patternSourceCanvas.add(oImg);

    var pattern = new fabric.Pattern({
      source: function() {

       patternSourceCanvas.setDimensions({
          width: oImg.getWidth(),
          height: oImg.getHeight()
        });

        return patternSourceCanvas.getElement();
      },
      repeat: 'no-repeat'
    });


    var text = new fabric.Text(entry, {
      originX: 'center',
      originY: 'center',
      left: (coords[i][0] * bufWidth),
      top: (coords[i][1] * bufHeight),
      fill: pattern,
      centeredRotation: true,
      angle: angles[i],
      fontFamily: 'Kapra',
      fontSize: 42
    });

提前非常感谢!

【问题讨论】:

    标签: javascript canvas fabricjs


    【解决方案1】:

    我有这个想法,你可以使用fabricJs对象的globalCompositeOperation属性来获得效果

    // clear canvas
    canvas.clear();
    
        var text = new fabric.Text('AAAAA', {
          originX: 'center',
          originY: 'center',
          left:30,
          top: 30,
          fill: 'rgba(0,0,0,1)',
          centeredRotation: true,
          angle: 20,
          fontSize: 100,
        });
    canvas.add(text);
    fabric.Image.fromURL('../assets/pug.jpg', function(oImg) { 
      oImg.globalCompositeOperation = 'source-atop';
      oImg.width = canvas.width;
      oImg.heigth = canvas.height;
      canvas.add(oImg);
      var rect = new fabric.Rect({
        width: 200,
        height: 200,
        globalCompositeOperation: 'destination-over',
        fill: 'black'
      });
      canvas.add(rect);   
    });
    

    所以基本上你可以用任何颜色渲染文本,黑色。 然后在文本上渲染彩色图像,覆盖所有画布,指定globalCompositeOperation = 'source-atop'

    在此之后,您将在白色背景上看到彩色文本。 要使用黑色背景,现在绘制一个与画布一样大的矩形,但指定 globalCompositeOperation = 'destination-over'

    所以你会做一些完全不同的事情,但它会起作用。 可能需要调整,可能不适合您的需求。但它应该显示您发布的示例。

    【讨论】:

    • 我只是尝试在 SVG 中导出该画布,但无法正常工作。
    猜你喜欢
    • 2013-06-25
    • 2021-03-02
    • 2020-01-15
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多