【问题标题】:How to identify fabric js image objects inserted to canvas?如何识别插入画布的织物 js 图像对象?
【发布时间】:2018-12-18 03:28:49
【问题描述】:

这里有两个具有两个不同 id 的图像。有没有办法识别插入(拖放)图像到画布的图像。(我想获取插入到画布的 id 图像) .

我正在尝试使用唯一的图像 ID 将图像详细信息(x、y、宽度、高度)发送到数据库。在fabric js中有没有办法做到这一点。

 
function initCanvas() {
  $('.canvas-container').each(function(index) {

    var canvasContainer = $(this)[0];
    var canvasObject = $("canvas", this)[0];

    var imageOffsetX, imageOffsetY;

    function handleDragStart(e) {
      [].forEach.call(images, function(img) {
        img.classList.remove('img_dragging');
      });
      this.classList.add('img_dragging');
      var imageOffset = $(this).offset();
      imageOffsetX = e.clientX - imageOffset.left;
      imageOffsetY = e.clientY - imageOffset.top;
    }

    function handleDragOver(e) {
      if (e.preventDefault) {
        e.preventDefault();
      }
      e.dataTransfer.dropEffect = 'copy';
      return false;
    }

    function handleDragEnter(e) {
      this.classList.add('over');
    }

    function handleDragLeave(e) {
      this.classList.remove('over');
    }

    function handleDrop(e) {
      e = e || window.event;
      if (e.preventDefault) {
        e.preventDefault();
      }
      if (e.stopPropagation) {
        e.stopPropagation();
      }
      var img = document.querySelector('.furniture img.img_dragging');
      console.log('event: ', e);

      var offset = $(canvasObject).offset();
      var y = e.clientY - (offset.top + imageOffsetY);
      var x = e.clientX - (offset.left + imageOffsetX);

      var newImage = new fabric.Image(img, {
        width: img.width,
        height: img.height,
        left: x,
        top: y
      });
      canvas.add(newImage);
      return false;
    }

    function handleDragEnd(e) {
      [].forEach.call(images, function(img) {
        img.classList.remove('img_dragging');
      });
    }

    var images = document.querySelectorAll('.furniture img');
    [].forEach.call(images, function(img) {
      img.addEventListener('dragstart', handleDragStart, false);
      img.addEventListener('dragend', handleDragEnd, false);
    });
    canvasContainer.addEventListener('dragenter', handleDragEnter, false);
    canvasContainer.addEventListener('dragover', handleDragOver, false);
    canvasContainer.addEventListener('dragleave', handleDragLeave, false);
    canvasContainer.addEventListener('drop', handleDrop, false);
  });
}
initCanvas();

var canvas = new fabric.Canvas('canvas1', {
  selection: false
});
<div class="fullpage">
  <div class="section">
 
    <div class="canvas-container">
      <canvas id="canvas1" style="border: 1px solid;width: 500px;height: 500px"></canvas>
    </div>
    <div class="furniture" style="padding: 20px;border: 1px solid;width: 460px">
      <h3>Drag the image to canvas</h3> 
      <img id="pic1" draggable="true" src="https://www.mve.com/media/Move_logo_-01.png" width="60">
      <img id="pic2" draggable="true" src="https://young.scot/media/8787/second-chances-logo-802x644.png" width="60">
    </div>
  </div>
</div>
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>

<script src='https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.6/fabric.min.js'></script>

【问题讨论】:

  • var img = document.querySelector('.furniture img.img_dragging');console.log('event: ', img.id);试试
  • @Durga 是的,这样我就可以获取图像 ID。但在我的应用程序中,我可以添加多个图像并将它们保存到数据库中。添加多张图片后,我无法以您的方式获取 id。
  • 搜索数据库时图像的左、上、宽和高如何?
  • 首先我将这些值放入一个字符串数组并将它们发送到数据库
  • 查看答案,您可以将id添加到图像对象中。

标签: javascript html fabricjs


【解决方案1】:

您可以从拖动的元素中获取 id,并将其添加为图像对象的属性。

function initCanvas() {
  $('.canvas-container').each(function(index) {

    var canvasContainer = $(this)[0];
    var canvasObject = $("canvas", this)[0];

    var imageOffsetX, imageOffsetY;

    function handleDragStart(e) {
      [].forEach.call(images, function(img) {
        img.classList.remove('img_dragging');
      });
      this.classList.add('img_dragging');
      var imageOffset = $(this).offset();
      imageOffsetX = e.clientX - imageOffset.left;
      imageOffsetY = e.clientY - imageOffset.top;
    }

    function handleDragOver(e) {
      if (e.preventDefault) {
        e.preventDefault();
      }
      e.dataTransfer.dropEffect = 'copy';
      return false;
    }

    function handleDragEnter(e) {
      this.classList.add('over');
    }

    function handleDragLeave(e) {
      this.classList.remove('over');
    }

    function handleDrop(e) {
      e = e || window.event;
      if (e.preventDefault) {
        e.preventDefault();
      }
      if (e.stopPropagation) {
        e.stopPropagation();
      }
      var img = document.querySelector('.furniture img.img_dragging');
      //console.log('event: ', e);

      var offset = $(canvasObject).offset();
      var y = e.clientY - (offset.top + imageOffsetY);
      var x = e.clientX - (offset.left + imageOffsetX);

      var newImage = new fabric.Image(img, {
        width: img.width,
        height: img.height,
        left: x,
        top: y,
        id: img.id
      });
      canvas.add(newImage);
      console.log(newImage.id)
      return false;
    }

    function handleDragEnd(e) {
      [].forEach.call(images, function(img) {
        img.classList.remove('img_dragging');
      });
    }

    var images = document.querySelectorAll('.furniture img');
    [].forEach.call(images, function(img) {
      img.addEventListener('dragstart', handleDragStart, false);
      img.addEventListener('dragend', handleDragEnd, false);
    });
    canvasContainer.addEventListener('dragenter', handleDragEnter, false);
    canvasContainer.addEventListener('dragover', handleDragOver, false);
    canvasContainer.addEventListener('dragleave', handleDragLeave, false);
    canvasContainer.addEventListener('drop', handleDrop, false);
  });
}
initCanvas();

var canvas = new fabric.Canvas('canvas1', {
  selection: false
});
<div class="fullpage">
  <div class="section">
 
    <div class="canvas-container">
      <canvas id="canvas1" style="border: 1px solid;width: 500px;height: 500px"></canvas>
    </div>
    <div class="furniture" style="padding: 20px;border: 1px solid;width: 460px">
      <h3>Drag the image to canvas</h3> 
      <img id="pic1" draggable="true" src="https://www.mve.com/media/Move_logo_-01.png" width="60">
      <img id="pic2" draggable="true" src="https://young.scot/media/8787/second-chances-logo-802x644.png" width="60">
    </div>
  </div>
</div>
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>

<script src='https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.6/fabric.min.js'></script>

【讨论】:

    【解决方案2】:

    使用 canvas.on('object:modified') 函数或获取活动对象并对其执行操作

     function initCanvas() {
          $('.canvas-container').each(function(index) {
    
            var canvasContainer = $(this)[0];
            var canvasObject = $("canvas", this)[0];
    
            var imageOffsetX, imageOffsetY;
    
            function handleDragStart(e) {
              [].forEach.call(images, function(img) {
                img.classList.remove('img_dragging');
              });
              this.classList.add('img_dragging');
              var imageOffset = $(this).offset();
              imageOffsetX = e.clientX - imageOffset.left;
              imageOffsetY = e.clientY - imageOffset.top;
            }
    
            function handleDragOver(e) {
              if (e.preventDefault) {
                e.preventDefault();
              }
              e.dataTransfer.dropEffect = 'copy';
              return false;
            }
    
            function handleDragEnter(e) {
              this.classList.add('over');
            }
    
            function handleDragLeave(e) {
              this.classList.remove('over');
            }
    
            function handleDrop(e) {
              e = e || window.event;
              if (e.preventDefault) {
                e.preventDefault();
              }
              if (e.stopPropagation) {
                e.stopPropagation();
              }
              var img = document.querySelector('.furniture img.img_dragging');
              console.log('event: ', e);
    
              var offset = $(canvasObject).offset();
              var y = e.clientY - (offset.top + imageOffsetY);
              var x = e.clientX - (offset.left + imageOffsetX);
    
              var newImage = new fabric.Image(img, {
                width: img.width,
                height: img.height,
                left: x,
                top: y,
                id:'SomeID'
    //Object id for identify
              });
              canvas.add(newImage);
              return false;
            }
    
            function handleDragEnd(e) {
              [].forEach.call(images, function(img) {
                img.classList.remove('img_dragging');
              });
            }
    
            var images = document.querySelectorAll('.furniture img');
            [].forEach.call(images, function(img) {
              img.addEventListener('dragstart', handleDragStart, false);
              img.addEventListener('dragend', handleDragEnd, false);
            });
            canvasContainer.addEventListener('dragenter', handleDragEnter, false);
            canvasContainer.addEventListener('dragover', handleDragOver, false);
            canvasContainer.addEventListener('dragleave', handleDragLeave, false);
            canvasContainer.addEventListener('drop', handleDrop, false);
          });
        }
        initCanvas();
    
        var canvas = new fabric.Canvas('canvas1', {
          selection: false
        });
    
        canvas.on('object:modified', function (e) {
        var activeobject = e.target;
        //Do as need 
    console.log(activeobject);
    
        alert(activeobject.get('id'));
    
                                    });
    

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 1970-01-01
      • 2019-12-12
      • 2016-05-15
      • 2016-07-02
      • 2017-11-14
      • 2021-09-25
      • 2019-09-19
      • 2015-12-14
      相关资源
      最近更新 更多