【问题标题】:clone one canvas to another having trouble将一个画布克隆到另一个有问题的画布
【发布时间】:2015-09-16 12:12:36
【问题描述】:

我已经检查了所有将现有画布克隆到另一个画布的答案。但我无法完成它。

请检查我目前的进度。 http://jsfiddle.net/37n8rtdf/5/

第一个画布将被剪裁到您最初看到的那个正方形,并且该画布的内容将被添加到另一个画布中。但我不知道它总是在 chrome 中抛出 TYPE_MISMATCH_ERR: DOM Exception 171。我正在使用fabricjs 来剪辑内容。

感谢您的帮助。

谢谢

这是我的脚本代码:

HTML

        <textarea id="line_1"></textarea>
        <input type="button" id="render" value="Apply" />

        <input type="button" id="preview" value="preview" />


        <canvas id="c" width="500" height="500" style="border:1px solid #ccc"></canvas>


        <canvas id="c_new" width="500" height="500" style="border:1px solid red; margin: 30px;"></canvas>

`

Javascript

            var canvas = this.__canvas = new fabric.Canvas('c');
            var canvas_new = this.__canvas = new fabric.Canvas('c_new');
            var product_image = 'http://www.jail.se/hardware/digital_camera/canon/ixus_800is-powershot_sd700/images/sample_photos/sample3.jpg';
            //var ctx = canvas.getContext("2d");
            var polygon;
            $(document).ready(function(){

            fabric.Object.prototype.transparentCorners = false;


            //canvas.setDimensions({width:w,height:h});
            var center = canvas.getCenter();
            canvas.setBackgroundImage(product_image,
                canvas.renderAll.bind(canvas), {
                    scaleX:1,
                    scaleY:1,
                    top: center.top,
                    left: center.left,
                    originX: 'center',
                    originY: 'center',
                    backgroundImageOpacity: 0,
                    backgroundImageStretch: false
            });
            canvas_new.setBackgroundImage(product_image,
                canvas_new.renderAll.bind(canvas_new), {
                    scaleX:1,
                    scaleY:1,
                    top: center.top,
                    left: center.left,
                    originX: 'center',
                    originY: 'center'
            });




                polygon = new fabric.Polygon([
                    {x: 0, y: 0},
                    {x: 220, y: 0},
                    {x: 220, y: 180},
                    {x: 0, y: 180} ], {
                    left: 140,
                    top: 150,
                    angle: 0,
                    fill: 'transparent',
                    stroke: '#000', strokeWidth: 1,
                    lockMovementX: true,
                    lockMovementY: true,
                    lockScalingX: true,
                    lockScalingY: true,
                    lockRotation: true,
                    hasControls: false,
                    hasBorders: false,
                    hoverCursor: 'default',
                    overflow: 'hidden'
                });
                canvas.add(polygon);
         $('#render').click(function(){ return render(); });

                $('#preview').click(function(){ return rasterize(); });


        });

        function render()
        {
            var text_val = $('#line_1').val();

            var comicSansText = new fabric.Text(text_val, {
              fontWeight: 'normal'
            });
            canvas.add(comicSansText.set({ left: 200, top: 150, angle: 0 }));
        }




          function rasterize()
          {
              var shape = canvas.item(0);
              polygon.strokeWidth=0;
              canvas.renderAll();
            //canvas.remove(shape);
            canvas.clipTo = function(ctx) {
                shape.render(ctx);
            };

            var ctx2    = canvas_new.getContext('2d');
            ctx2.drawImage(canvas, 0, 0);
          }

`

【问题讨论】:

  • StackOverflow 中的帖子应包含问题的最小再现。否则,如果链接断开,帖子将毫无意义。
  • @JosephtheDreamer 我已经编辑了问题。抱歉我发的太匆忙了。

标签: javascript jquery html canvas fabricjs


【解决方案1】:

@WinterMute 是对的,您正在尝试绘制 Fabric 对象而不是画布元素。

您的织物对象似乎嵌入了两个画布(lowerCanvasElupperCanvasEl)。 所以你可以稍微修改一下你的代码,让它看起来像:

function rasterize() {
  var shape = canvas.item(0);
  polygon.strokeWidth = 0;
  canvas.renderAll();

  canvas.clipTo = function(ctx) {
    shape.render(ctx);
  };
  var ctx2 = canvas_new.getContext('2d');
  ctx2.drawImage(canvas.lowerCanvasEl, 0, 0);
  ctx2.drawImage(canvas.upperCanvasEl, 0, 0);
}

Updated fiddle

【讨论】:

  • @kaiodp,这没有按预期工作。在rasterize() 中,我确实将所有图层剪裁到该多边形。然后最终输出将被复制到新的画布上。
  • 我不太了解fabricjs(这就是为什么我在WinterMute 要求我之前没有回答的原因),但是clipTo 是一种方法,我怀疑您的代码中还有其他一些问题我现在不能挖。但是我的回答涵盖了将画布复制到另一个画布的部分。现在,您必须将您的第一个画布实际剪辑到您想要的位置(如果没有库,我会使用 drawImage(CanvasElement, sourceX, sourceY, sourceWidth, sourceHeight, targetX, targetY, targetWidth, targetHeight);,但我认为 clipTo 可能会在木下进行。
猜你喜欢
  • 1970-01-01
  • 2019-04-07
  • 2012-05-23
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 2013-06-23
  • 2013-12-17
  • 2016-03-03
相关资源
最近更新 更多