【问题标题】:How to erase drawing in fabric.js?如何擦除fabric.js中的绘图?
【发布时间】:2017-07-06 16:31:17
【问题描述】:

有一个带有对象的画布。需要在物体上绘图,还需要橡皮擦功能。 查看画布截图: canvas where able drawing function

我看到 fabric.js 没有擦除功能。有什么方法可以用擦除刷擦除绘图吗?

谢谢

【问题讨论】:

    标签: javascript canvas html5-canvas fabricjs drawing2d


    【解决方案1】:

    var toBase64Btn = document.getElementById("toBase64");
    var canvas = document.getElementById("a");
    var ctx = canvas.getContext("2d");
    var drawing = false;
    var drawingMode = "add";
    var pencilWidth = 25;
    var base64Str = "";
    var fabCan = new fabric.Canvas("b");
    var fillColor = "rgba(255,0,0,.5)";
    
    var getMouseCoordinate = function (evt) {
    	return {
      	x : evt.pageX - this.offsetLeft,
        y : evt.pageY - this.offsetTop
      };
    };
    
    canvas.onmousedown = function (e) {
    	if (drawing) return false;
      drawing = true;
      var mouse = getMouseCoordinate.call(this, e);
      
      ctx.globalCompositeOperation = drawingMode === "add" ? "xor" : "destination-out";
      ctx.fillStyle = drawingMode === "add" ? fillColor : "rgba(0,0,0,1)";
      
      ctx.beginPath();
      ctx.arc(mouse.x, mouse.y, pencilWidth, 0, 2*Math.PI);
      ctx.fill();
      ctx.closePath();
    };
    
    canvas.onmousemove = function (e) {
    	if (!drawing) return false;
      var mouse = getMouseCoordinate.call(this, e);
      ctx.beginPath();
      ctx.arc(mouse.x, mouse.y, pencilWidth, 0, 2*Math.PI);
      ctx.fill();
      ctx.closePath();
    };
    
    canvas.onmouseup = function (e) {
    	if (!drawing) return false;
      drawing = false;
    };
    
    toBase64Btn.onclick = function () {
    	if (drawing) return false;
      
      var img = document.createElement("img");
      
      img.onload = function () {
      
      	var group = [];
      
      	ctx.clearRect(0,0,canvas.width, canvas.height);
        fabCan.add(new fabric.Image(this));
        
        fabCan.getObjects().forEach(function (obj) {
        	obj.globalCompositeOperation = "xor";
          group.push(obj);
        });
        
        fabCan.clear().add(new fabric.Group(group)).renderAll();
      };
      
      img.src = canvas.toDataURL("image/png");
    };
    
    document.getElementById("erase").onchange = function () {
    	drawingMode = this.checked ? "delete" : "add";
      console.warn(drawingMode);
    };
    
    fabCan.add(new fabric.Rect({
    width: 100,
    height: 100,
    fill: fillColor
    }));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.3/fabric.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    Erase: <input id="erase" type="checkbox">
    <button id="toBase64" type="button">addToAOILayer</button><br/>
    <canvas id="a" width="400" height="300"></canvas>
    <canvas id="b" width="400" height="300"></canvas>

    我的代码在这里 html

    Erase: <input id="erase" type="checkbox">
    <button id="toBase64" type="button">addToAOILayer</button><br/>
    <canvas id="a" width="400" height="300"></canvas>
    <canvas id="b" width="400" height="300"></canvas>
    

    Fabric.js

    var toBase64Btn = document.getElementById("toBase64");
    var canvas = document.getElementById("a");
    var ctx = canvas.getContext("2d");
    var drawing = false;
    var drawingMode = "add";
    var pencilWidth = 25;
    var base64Str = "";
    var fabCan = new fabric.Canvas("b");
    var fillColor = "rgba(255,0,0,.5)";
    
    var getMouseCoordinate = function (evt) {
        return {
        x : evt.pageX - this.offsetLeft,
        y : evt.pageY - this.offsetTop
      };
    };
    
    canvas.onmousedown = function (e) {
        if (drawing) return false;
      drawing = true;
      var mouse = getMouseCoordinate.call(this, e);
    
      ctx.globalCompositeOperation = drawingMode === "add" ? "xor" : "destination-out";
      ctx.fillStyle = drawingMode === "add" ? fillColor : "rgba(0,0,0,1)";
    
      ctx.beginPath();
      ctx.arc(mouse.x, mouse.y, pencilWidth, 0, 2*Math.PI);
      ctx.fill();
      ctx.closePath();
    };
    
    canvas.onmousemove = function (e) {
        if (!drawing) return false;
      var mouse = getMouseCoordinate.call(this, e);
      ctx.beginPath();
      ctx.arc(mouse.x, mouse.y, pencilWidth, 0, 2*Math.PI);
      ctx.fill();
      ctx.closePath();
    };
    
    canvas.onmouseup = function (e) {
        if (!drawing) return false;
      drawing = false;
    };
    
    toBase64Btn.onclick = function () {
        if (drawing) return false;
    
      var img = document.createElement("img");
    
      img.onload = function () {
    
        var group = [];
    
        ctx.clearRect(0,0,canvas.width, canvas.height);
        fabCan.add(new fabric.Image(this));
    
        fabCan.getObjects().forEach(function (obj) {
            obj.globalCompositeOperation = "xor";
          group.push(obj);
        });
    
        fabCan.clear().add(new fabric.Group(group)).renderAll();
      };
    
      img.src = canvas.toDataURL("image/png");
    };
    
    document.getElementById("erase").onchange = function () {
        drawingMode = this.checked ? "delete" : "add";
      console.warn(drawingMode);
    };
    
    fabCan.add(new fabric.Rect({
    width: 100,
    height: 100,
    fill: fillColor
    }));
    

    我觉得对你有帮助

    【讨论】:

    • Eraser 的上述示例的某些部分很好,但仅使用画布而不是织物 js。
    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2011-10-20
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多