需要帮助使用javascript在矩形上显示选择句柄

时间:2014-04-01 22:14:20

标签: javascript

我想在我的代码中添加一些东西,以便在绘制后选择图像(选择处理程序应该出现在角落和边缘的中间),然后拖动或增加/减少高度和宽度?

我的示例代码在小提琴中,在此我使用鼠标事件处理程序绘制一个矩形。我想选择矩形并使用选择处理程序修改/更改它,而不是再次绘制它。

单击按钮ROI,指标,然后您可以使用鼠标事件绘制它。

http://jsfiddle.net/AhdJr/53/

 var oImageBuffer = document.createElement('img');
  var oCanvas=document.getElementById("SetupImageCanvas");
  var o2DContext=oCanvas.getContext("2d");
  var oRect = {};
  var oROI = {};
var oMetrics ={};
  var oLayers = new Array();
  var bDragging = false;
  var bSetROI = false;
  var bSetLayers = false;
  InitMouseEvents();
  var oSelect = document.getElementById("ImageList");
  oSelect.onchange=function() {
    changeCanvasImage(oSelect[oSelect.selectedIndex].value);
  }


  // Canvas event handlers (listeners).
  function InitMouseEvents() {
    oCanvas.addEventListener('mousedown', MouseDownEvent, false);
    oCanvas.addEventListener('mouseup', MouseUpEvent, false);
    oCanvas.addEventListener('mousemove', MouseMoveEvent, false);
    oCanvas.addEventListener('mouseout', MouseOutEvent, false);
  }
  function MouseDownEvent(e) {
    oRect.startX = e.pageX - this.offsetLeft;
    oRect.startY = e.pageY - this.offsetTop;
    bDragging = true;
  }
  function MouseUpEvent() {
    bDragging = false;
  }
  function MouseOutEvent() {
    document.getElementById("MouseCoords").innerHTML="";
  }
  function MouseMoveEvent(e) {
    if (bDragging) {
      oRect.w = (e.pageX - this.offsetLeft) - oRect.startX;
      oRect.h = (e.pageY - this.offsetTop) - oRect.startY;
      oCanvas.getContext('2d').clearRect(0,0,oCanvas.width, oCanvas.height);

        var oROI = document.getElementById("btnROI");
      if (oROI.checked) {
        SetROI();
      }
      var oLayer = document.getElementById("btnLAYER");
      if (oLayer.checked) {
        SetLayer();
      }

          var oMetrics = document.getElementById("btnMetrics");
          if (oMetrics.checked) {
            SetMetrics();
          }
    }

    if (bSetROI) {
      DrawROI();
    }

    if (bSetLayers) {
      DrawLayers();
    }

     if(bSetMetrics){
        DrawMetrics();

    }
    // Display the current mouse coordinates.
    ShowCoordinates(e);
  }

  function ShowCoordinates(e) {
    x=e.clientX;
    y=e.clientY;
    document.getElementById("MouseCoords").innerHTML="(" + x + "," + y + ") " + document.getElementById('txtPatchCount').value;
  }

  // Interactively draw ROI rectangle(s) on the canvas.
  function SetROI() {
    bSetROI = true;
    oROI.startX = oRect.startX;
    oROI.startY = oRect.startY;
    oROI.w = oRect.w;
    oROI.h = oRect.h;    
  }

  function DrawROI() {
    o2DContext.lineWidth=1.5;
    o2DContext.strokeStyle = '#0F0';
    o2DContext.strokeRect(oROI.startX, oROI.startY, oROI.w, oROI.h);

    var iPatches = document.getElementById('txtPatchCount').value;
    o2DContext.beginPath();
    var iTop = oROI.startY;
    var iBottom = oROI.startY + oROI.h;
    var iLeft = oROI.startX;
    var iX = iLeft;
    for (var iPatch=1; iPatch<iPatches; ++iPatch) {
      iX = iLeft + iPatch*oROI.w/iPatches;
      o2DContext.moveTo(iX, iTop);
      o2DContext.lineTo(iX, iBottom);
    }
    o2DContext.lineWidth=0.25;
    o2DContext.stroke();
  }

function SetMetrics() {
    bSetMetrics = true;
    oMetrics.startX = oRect.startX;
    oMetrics.startY = oRect.startY;
    oMetrics.w = oRect.w;
    oMetrics.h = oRect.h;    
  }

  function DrawMetrics(){

       o2DContext.strokeStyle = 'black';
      o2DContext.strokeRect(oMetrics.startX, oMetrics.startY, oMetrics.w, oMetrics.h);
      o2DContext.beginPath();
      var iTop = oMetrics.startY;
    var iBottom = oMetrics.startY + oMetrics.h;
    var iLeft = oMetrics.startX;
    var iX = iLeft;
      o2DContext.moveTo(iX, iTop);
      o2DContext.lineTo(iX, iBottom);
       o2DContext.stroke();
        }
  // Interactively draw layer boundaries on the canvas.
  function SetLayer() {
    bSetLayers = true;
    oLayers.length = 0;
    oLayers.push(oRect.startY);
    oLayers.push(oRect.startY + oRect.h);
  }
  function DrawLayers() {
    o2DContext.lineWidth=0.25;
    o2DContext.strokeStyle = '#F00';

    o2DContext.beginPath();
    var iY = oLayers[0];
    var iLeft = 0;
    var iRight = oCanvas.width;
    for (var iLayer=0; iLayer<oLayers.length; ++iLayer) {
      iY = oLayers[iLayer];
      o2DContext.moveTo(iLeft, iY);
      o2DContext.lineTo(iRight, iY);
      o2DContext.stroke();
    }
  }

下面的博客也在做同样的事情,但我不确定如何在我的代码中添加此功能。

http://simonsarris.com/blog/225-canvas-selecting-resizing-shape

请指导我如何添加相同的内容。

非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

尝试以下链接。 这有点你想要实现。

http://simonsarris.com/blog/225-canvas-selecting-resizing-shape