如何获取在html5画布上绘制的任何图像元素(可调整大小/可拖动)的位置(坐标)?

时间:2013-04-07 09:13:30

标签: javascript jquery html5 html5-canvas

目前我正在点击该图片在html5画布上绘制图像。绘制该图像的代码如下:

这是给定的脚本函数:

<script>
  function update(activeAnchor) {
    var group = activeAnchor.getParent();

    var topLeft = group.get('.topLeft')[0];
    var topRight = group.get('.topRight')[0];
    var bottomRight = group.get('.bottomRight')[0];
    var bottomLeft = group.get('.bottomLeft')[0];
    var image = group.get('.image')[0];

    var anchorX = activeAnchor.getX();
    var anchorY = activeAnchor.getY();

    // update anchor positions
    switch (activeAnchor.getName()) {
      case 'topLeft':
        topRight.setY(anchorY);
        bottomLeft.setX(anchorX);
        break;
      case 'topRight':
        topLeft.setY(anchorY);
        bottomRight.setX(anchorX);
        break;
      case 'bottomRight':
        bottomLeft.setY(anchorY);
        topRight.setX(anchorX); 
        break;
      case 'bottomLeft':
        bottomRight.setY(anchorY);
        topLeft.setX(anchorX); 
        break;
    }

    image.setPosition(topLeft.getPosition());

    var width = topRight.getX() - topLeft.getX();
    var height = bottomLeft.getY() - topLeft.getY();
    if(width && height) {
      image.setSize(width, height);
    }
  }

  function addAnchor(group, x, y, name) {
    var stage = group.getStage();
    var layer = group.getLayer();

    var anchor = new Kinetic.Circle({
      x: x,
      y: y,
      stroke: '#666',
      fill: '#ddd',
      strokeWidth: 2,
      radius: 8,
      name: name,
      draggable: true,
      dragOnTop: false
    });

    anchor.on('dragmove', function() {
      update(this);
      layer.draw();
    });
    anchor.on('mousedown touchstart', function() {
      group.setDraggable(false);
      this.moveToTop();
    });
    anchor.on('dragend', function() {
      group.setDraggable(true);
      layer.draw();
    });
    // add hover styling
    anchor.on('mouseover', function() {
      var layer = this.getLayer();
      document.body.style.cursor = 'pointer';
      this.setStrokeWidth(4);
      layer.draw();
    });
    anchor.on('mouseout', function() {
      var layer = this.getLayer();
      document.body.style.cursor = 'default';
      this.setStrokeWidth(2);
      layer.draw();
    });

    group.add(anchor);
  }

  function loadImages(sources, callback) {
    var images = {};
    var loadedImages = 0;
    var numImages = 0;
    for(var src in sources) {
      numImages++;
    }
    for(var src in sources) {
      images[src] = new Image();
      images[src].onload = function() {
        if(++loadedImages >= numImages) {
          callback(images);
        }
      };
      images[src].src = sources[src];
    }
  }

  function initStage(images) {
    var stage = new Kinetic.Stage({
      container: 'container_canvas',
      width: 578,
      height: 400
    });
    var darthVaderGroup = new Kinetic.Group({
      x: 270,
      y: 100,
      draggable: true
    });

    var layer = new Kinetic.Layer();


    layer.add(darthVaderGroup);

    stage.add(layer);


    var darthVaderImg = new Kinetic.Image({
      x: 0,
      y: 0,
      image: images.darthVader,
      width: 200,
      height: 138,
      name: 'image'
    });

    darthVaderGroup.add(darthVaderImg);
    addAnchor(darthVaderGroup, 0, 0, 'topLeft');
    addAnchor(darthVaderGroup, 200, 0, 'topRight');
    addAnchor(darthVaderGroup, 200, 138, 'bottomRight');
    addAnchor(darthVaderGroup, 0, 138, 'bottomLeft');

    darthVaderGroup.on('dragstart', function() {
      this.moveToTop();
    });
    stage.draw();

  }
function putDesign(designSrc)
{
designSrc = designSrc.split("images/"); 
 var sources = {
    darthVader: 'images/'+designSrc[1],
  };
  loadImages(sources, initStage);
  }
</script>

我正在使用kinetic-v4.4.0.min.js( http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.4.0.min.js ), 在html中,我只是调用此函数 putDesign ,因此此代码将在此iv中绘制画布。

    <div class="behind" id="behind"> 
        <div id="canvasProductImage" style="text-align:center; width:300px;    height:300px; background:url(images/a.png) 100px 100px  no-repeat;">

       <div id="container_canvas"></div>
        </div> 

现在这段代码会让我在div中绘制图像。这里是图像1(tshirt(我们将绘制画布的div的背景图像))和图像2(绘制的元素), 所以mai的任务是如何获得drwan图像的位置,这意味着我如何知道画布上绘制的图像在坐标中的位置?因为图像对象是可调整大小和可拖动的所以我想要最后定位的坐标?在此先感谢我非常接近我的目标,友好的帮助。

首先是

图像:

enter image description here

图像第二:

enter image description here

1 个答案:

答案 0 :(得分:4)

如何获取可拖动/可调整大小的图像信息(X / Y /宽度/高度)

此代码会在您拖动/调整其大小时报告您的图片信息:

      darthVaderGroup.on("dragend",function(){$("#info").text(getImageInfo());});

      function getImageInfo(){
          var image=darthVaderImg;
          return(
              "   X/Y:"+
              image.getAbsolutePosition().x+"/"+
              image.getAbsolutePosition().y+" -- Width/Height:"+
              image.getWidth()+"/"+
              image.getHeight()          
          );
      }

这是代码和小提琴:http://jsfiddle.net/m1erickson/Hm9uN/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.4.1.min.js"></script>

<style>
    body{ background-color: ivory; padding:15px; }
    canvas{border:1px solid red;}
    #wrapper{ position:relative; width:400px; height:400px; }
    #Tshirt,#container_canvas{ position:absolute; top:0; left:0; }
</style>

<script>
$(function(){

    function update(activeAnchor) {
      var group = activeAnchor.getParent();
      var topLeft = group.get('.topLeft')[0];
      var topRight = group.get('.topRight')[0];
      var bottomRight = group.get('.bottomRight')[0];
      var bottomLeft = group.get('.bottomLeft')[0];
      var image = group.get('.image')[0];

      var anchorX = activeAnchor.getX();
      var anchorY = activeAnchor.getY();

      // update anchor positions
      switch (activeAnchor.getName()) {
        case 'topLeft':
          topRight.setY(anchorY);
          bottomLeft.setX(anchorX);
          break;
        case 'topRight':
          topLeft.setY(anchorY);
          bottomRight.setX(anchorX);
          break;
        case 'bottomRight':
          bottomLeft.setY(anchorY);
          topRight.setX(anchorX); 
          break;
        case 'bottomLeft':
          bottomRight.setY(anchorY);
          topLeft.setX(anchorX); 
          break;
      }

      image.setPosition(topLeft.getPosition());

      var width = topRight.getX() - topLeft.getX();
      var height = bottomLeft.getY() - topLeft.getY();
      if(width && height) {
        image.setSize(width, height);
      }

      imgX=image.getAbsolutePosition().x;
      imgY=image.getAbsolutePosition().y;
      imgWidth=image.getWidth();
      imgHeight=image.getHeight();

    }

    function addAnchor(group, x, y, name) {
      var stage = group.getStage();
      var layer = group.getLayer();

      var anchor = new Kinetic.Circle({
        x: x,
        y: y,
        stroke: '#666',
        fill: '#ddd',
        strokeWidth: 2,
        radius: 8,
        name: name,
        draggable: true,
        dragOnTop: false
      });

      anchor.on('dragmove', function() {
        update(this);
        layer.draw();
      });
      anchor.on('mousedown touchstart', function() {
        group.setDraggable(false);
        this.moveToTop();
      });
      anchor.on('dragend', function() {
        group.setDraggable(true);
        layer.draw();
      });
      // add hover styling
      anchor.on('mouseover', function() {
        var layer = this.getLayer();
        document.body.style.cursor = 'pointer';
        this.setStrokeWidth(4);
        layer.draw();
      });
      anchor.on('mouseout', function() {
        var layer = this.getLayer();
        document.body.style.cursor = 'default';
        this.setStrokeWidth(2);
        layer.draw();
      });

      group.add(anchor);
    }

    function initStage(images) {
      var stage = new Kinetic.Stage({
        container: 'container_canvas',
        width: 578,
        height: 400
      });
      var darthVaderGroup = new Kinetic.Group({
        x: 270,
        y: 100,
        draggable: true
      });
      var layer = new Kinetic.Layer();
      layer.add(darthVaderGroup);
      stage.add(layer);


      var darthVaderImg = new Kinetic.Image({
        x: 0,
        y: 0,
        image: images.darthVader,
        width: 200,
        height: 138,
        name: 'image'
      });

      darthVaderGroup.add(darthVaderImg);
      addAnchor(darthVaderGroup, 0, 0, 'topLeft');
      addAnchor(darthVaderGroup, 200, 0, 'topRight');
      addAnchor(darthVaderGroup, 200, 138, 'bottomRight');
      addAnchor(darthVaderGroup, 0, 138, 'bottomLeft');

      darthVaderGroup.on('dragstart', function() {
        this.moveToTop();
      });
      stage.draw();

      darthVaderGroup.on("dragend",function(){$("#info").text(getImageInfo());});

      function getImageInfo(){
          var image=darthVaderImg;
          return(
              "   X/Y:"+
              image.getAbsolutePosition().x+"/"+
              image.getAbsolutePosition().y+" -- Width/Height:"+
              image.getWidth()+"/"+
              image.getHeight()          
          );
      }

    }

  function putDesign(designSrc){
      designSrc = designSrc.split("images/"); 
      var sources = {
          darthVader: 'http://dl.dropbox.com/u/139992952/stackoverflow/love.png'
      };
      loadImages(sources, initStage);
  }

  function loadImages(sources, callback) {
    var images = {};
    var loadedImages = 0;
    var numImages = 0;
    for(var src in sources) {
      numImages++;
    }
    for(var src in sources) {
      images[src] = new Image();
      images[src].onload = function() {
        if(++loadedImages >= numImages) {
          callback(images);
        }
      };
      images[src].src = sources[src];
    }
  }

  putDesign("yourAssets");


}); // end $(function(){});
</script>

</head>

<body>
    <p>Info:<span id="info"></span></p><br/>
    <div id="wrapper">
        <img id="Tshirt" src="http://dl.dropbox.com/u/139992952/stackoverflow/Tshirt.png" width=167px height=167px>
        <div id="container_canvas"></div>            
    </div><br/>
</body>
</html>