【问题标题】:Draw image within a shape using Fabricjs使用 Fabricjs 在形状内绘制图像
【发布时间】:2012-01-12 03:07:43
【问题描述】:

我目前正在使用画布和 Javascript 进行图像处理。我正在使用fabric.js。我只是希望用户上传一张图片并将其与我们提供的模板合并。即,

我想只在中心的空圆圈中显示上传的图片,他们可以通过拖动来调整。

  • 如果我将模板保留为上层,则用户无法拖动和调整,因为画布已充满模板。
  • 如果我将上传的图片保持在上层,那么图片会溢出圆圈。

如何通过为我的用户提供易于使用的界面来解决这个问题?我尝试了 fabric.js 中的 ClipTo 函数,但它不适用于图像对象。

【问题讨论】:

    标签: javascript html5-canvas fabricjs


    【解决方案1】:

    我认为overlayImage 是您所追求的。

    以customization demo为例:

    var canvas = new fabric.Canvas('c13');
    var circle = new fabric.Circle({ 
      radius: 30, 
      fill: '#f55', 
      top: 100, 
      left: 100 
    });
    canvas.add(circle);
    canvas.setOverlayImage('../assets/jail_cell_bars.png', 
      canvas.renderAll.bind(canvas));
    

    【讨论】:

    • 谢谢。但是我可以在叠加图像上放置一个 Text 对象吗?
    • 并非如此。 overlayImage 旨在绘制在其他所有内容之上。这是一个简单的drawImage 调用,发生在渲染循环的最后。但是如果这个图像在中间是透明的,你真的需要它在上面吗?看起来好像该圆形区域内的任何内容都被它剪裁了。
    • 但我的应用确实需要 3 层。 1)用户上传的图像仅通过模板的透明区域显示(参考图像) 2)模板类似于问题图像 3)模板顶部的文本。我可以在fabricjs的上部画布上画一些东西而不干扰overlayimage吗?
    • 是的,这可能有点复杂。我在设计面料时没有考虑过这样的用例。您可以使用“after:render”回调,并在canvas.contextContainer 上手动绘制一些东西(例如,使用本机strokeText 方法)。但是在顶部渲染织物对象并不容易。也许通过创建文本对象的一些技巧,然后在 contextContainer 的上下文中调用其 _render 方法 - textObj._render(canvas.contextContainer)(在“after:render”回调中)或类似的东西。
    【解决方案2】:

    您可以将照片和模板都绘制到画布中。我不确定fabric.js,但如果你直接调用画布函数,你会简单地......

    ctx = canvas.getContext('2d');
    ctx.DrawImage(user_img, x,y);
    ctx.DragImage(template_imb, 0, 0);
    

    当用户拖动鼠标更新 x 和 y 并重绘两个图层。显然要确保模板中的孔是透明的。如果您希望用户能够调整图像大小,您可以在 DrawImage 调用中添加宽度和高度,只需提供某种控制来更改它们。

    【讨论】:

      【解决方案3】:

      更困难的方法是创建一个临时(离屏)画布。使用globalCompositeOperation=source-in,在蒙版图像上绘制图像,然后从那里getImageData 和putImageData 到目标画布上。​​

      但如果Charles' answer 适合你,那就更直接了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多