【问题标题】:Fabric toDataUrl with multiplier not working as expected具有乘数的 Fabric toDataUrl 未按预期工作
【发布时间】:2016-03-01 06:59:07
【问题描述】:

在我的代码中,我创建了使用织物形状剪辑图像的方法。我已经使用 stackoverflow 答案来实现这一点。不知何故,使用此方法后,我无法使用默认的织物画布渲染方法渲染画布。

var img01URL = 'https://www.google.com/images/srpr/logo4w.png';
var img02URL = 'http://fabricjs.com/lib/pug.jpg';

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

document.getElementById('download').addEventListener('click', function() {
  canvas.renderAll();
  this.href = canvas.toDataURL({
    format: 'png',
    multiplier: 2        
  });
  this.download = "test.png";
}, false);

var clipRect1 = new fabric.Rect({
    originX: 'left',
    originY: 'top',
    angle: 90,
    left: 195,
    top: 0,
    width: 200,
    height: 200,
    fill: '#DDD', /* use transparent for no fill */
    strokeWidth: 1,
    lockMovementX: true,
    lockMovementY: true,
    angle: 5,
    stroke: 'red'
});

var pugImg = new Image();
pugImg.onload = function (img) {    
    var pug = new fabric.Image(pugImg, {
        angle: 0,
        width: 500,
        height: 500,
        left: 245,
        top: 35,
        scaleX: 0.3,
        scaleY: 0.3,
        clipName: 'pug',
        clipTo: function(ctx) { 
            ctx.save();
            ctx.setTransform(1, 0, 0, 1, 0, 0);
            clipRect1.render(ctx);
            ctx.restore();
        }
    });
    canvas.add(pug);
};
pugImg.src = img02URL;
pugImg.setAttribute('crossOrigin', 'anonymous');
#c {
    border:0px solid #ccc;
}
<script src="//cdn.bootcss.com/fabric.js/1.5.0/fabric.js"></script>
<canvas id="c" width="500" height="400"></canvas>
<a id="download">Download as image</a>

【问题讨论】:

  • 有人知道方法吗?
  • 未捕获的安全错误:无法在“HTMLCanvasElement”上执行“toDataURL”:可能无法导出受污染的画布。您在控制台中注意到这一点了吗?
  • 如果有人想提供帮助,为了清楚起见,我从小提琴中删除了未使用的功能。如果寻求帮助,您应该提交一个干净的示例。

标签: html5-canvas fabricjs


【解决方案1】:

你的问题是乘数。 使用这种 clipTo 函数时,您将画布的变换设置为普通。当使用带有乘数的画布进行渲染时,基本的画布变换由乘数缩放。

你的矩形将在没有这个变换的情况下被绘制(因为 setTransform(1,0,0,1,0,0) 并且会剪掉图像。

不应将变换设置为 [1,0,0,1,0,0],而应将其设置为正在剪切的对象的当前变换的倒数。

var img01URL = 'https://www.google.com/images/srpr/logo4w.png';
var img02URL = 'http://fabricjs.com/lib/pug.jpg';

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

document.getElementById('download').addEventListener('click', function() {
  var data = canvas.toDataURL({
    format: 'png',
    multiplier: 2        
  });
  console.log(data);
  //var img = document.getElementById('export');
  //img.src = data;
}, false);

var clipRect1 = new fabric.Rect({
    originX: 'left',
    originY: 'top',
    angle: 90,
    left: 195,
    top: 0,
    width: 200,
    height: 200,
    fill: '#DDD', /* use transparent for no fill */
    strokeWidth: 1,
    lockMovementX: true,
    lockMovementY: true,
    stroke: 'red',
    angle: 5
});



var pugImg = new Image();
pugImg.onload = function (img) {    
    var pug = new fabric.Image(pugImg, {
        angle: 0,
        width: 500,
        height: 500,
        left: 245,
        top: 35,
        scaleX: 0.3,
        scaleY: 0.3,
        clipName: 'pug',
        clipTo: function(ctx) { 
            ctx.save();
            var myMatrix = this.calcTransformMatrix();
            myMatrix = fabric.util.invertTransform(myMatrix);
            ctx.transform.apply(ctx, myMatrix);
            clipRect1.render(ctx);
            ctx.restore();
        }
    });
    canvas.add(pug);
};
pugImg.src = img02URL;
#c {
    border:0px solid #ccc;
}
<script src="//www.deltalink.it/andreab/fabric/fabric.js"></script>
<canvas id="c" width="500" height="400"></canvas>
<a id="download">Download as image</a>
<img id="export" >

【讨论】:

  • 非常感谢您的回答。我会试试这个并告诉结果
  • 您对乘数的看法是正确的。但是如何设置当前变换的逆?
  • 现在可以完成了...我在 clipTo 函数中发布的代码获取了倒置矩阵,但我发现没有简单的方法可以在函数...也许我们需要更新 clipTo 方法,或者我现在错了
  • 忽略我的评论。只是你需要我在 sn-p 中链接的代码的更新版本。
  • 您使用的是这种定制的面料版本吗?使用fabric 1.6.0-rc.1 时出现“TypeError:this.calcTransformMatrix 不是函数”
猜你喜欢
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2013-05-21
  • 2023-02-17
相关资源
最近更新 更多