2016-03-01 63 views
1

在我的代碼中,我創建了使用結構形狀剪裁圖像的方法。我已經使用stackoverflow答案來實現這一點。不知何故,在使用此方法後,我無法使用默認結構畫布渲染方法呈現畫布。結構toDataUrl乘數不能按預期工作

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>

+0

有誰知道方法 – Dushan

+0

未捕獲的SecurityError:未能執行'HTMLCanvasEl上的'toDataURL' ement':受污染的畫布可能無法出口。你有沒有注意到你的控制檯? – AndreaBogazzi

+0

爲了清晰起見,如果有人想幫忙,我從小提琴中刪除了未使用的功能。如果尋求幫助,你應該提交一個乾淨的例子。 – AndreaBogazzi

回答

2

你的問題是事半功倍的。 使用這種clipTo函數時,您將canvas的變換設置爲plain。當使用乘數進行畫布渲染時,基本畫布變換由乘數縮放。

您的矩形將沒有這個變換(因爲一個setTransform(1,0,0,1,0,0),並會剪輯出的圖像。

繪製而不是設置變換設置爲[1,0 ,0,1,0,0]你應該設置爲你剪裁對象的當前變換的INVERS

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" >

+0

非常感謝你的回答。我會試試這個,讓我們知道結果 – Dushan

+0

你對乘數是正確的。但是如何設置電流變換的倒數? – Dushan

+0

對不起,我沒有更新答案,現在正在做 – AndreaBogazzi