使用kinetic和id给画布

时间:2013-12-17 22:27:37

标签: javascript html5 canvas kineticjs

我正在尝试将画布下载到我的计算机上作为图像,我可以通过kinetic通过编辑生成的html来检查chrome中的元素,只需将id =“canvas”添加到画布中,就可以正常工作。但是我无法通过代码本身找到如何做到这一点。

我知道每次我创建一个新的动态层时,我实际上是在创建一个新的canvas类,但我不确定如何添加id或者它是否可行。

非常感谢任何帮助,

梅丽莎

HTML:

<!DOCTYPE HTML>
<html>
  <head>
<title>Test Page</title>
<style>
  body {
    margin: 0px;
    padding: 0px;
  }
  canvas {
    border: 1px solid #9C9898;
  }
</style>

<script src="kinetic-v3.9.7.min.js"></script>
<script src="canvas2image.js"></script>
<script src="base64.js"></script>
<script src="script.js"></script>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"> </script>


<script>
   $( document ).ready(function() {       
  function downloadCanvas(link, canvasId, filename) {
link.href = document.getElementById(canvasId).toDataURL();
link.download = filename;
}


document.getElementById('download').addEventListener('click', function() {
downloadCanvas(this, 'canvas', 'test.png');
}, false);
});

$(function() {
$("canvas").attr("id","canvas");

});

</script>

</head>
<body onmousedown="return false;">
<div id="right" style="float: right;">

 <a id="download" href="#">Download as image</a>


<input type='file' onchange="readURL(this);" />    
<img src="#" name="addimg" id="addimg" onClick="addClickedImage('addimg')" /><br /><br />


  <a href="#" name="downloadcanvas" id="downloadcanvas" onClick="downloadCanvas()">download</a><br /><br />
  <a href="#" name="clearcanvas" id="clearcanvas" onClick="clearCanvas()">clear</a>
      </div><!-- #right -->
  <div role="main">
  <div id="container">
  </div><!-- #container -->
  </div><!-- main -->
  </body>

JS

 var stage;
  var layer;
  var selected;
  var wasSelected;
  var haveBackground; // first dragged image sets stage size

  /*
   * Set up canvas stage and layer
   */
  function initCanvas(canvas) {
    stage = new Kinetic.Stage({
      container: canvas,
      width: 850,
      height: 500
    });
    layer = new Kinetic.Layer();
    stage.add(layer);
    stage.draw();
  }


  /*
   * Clear canvas, start again
   */
  function clearCanvas() {
    layer.removeChildren();
    layer.draw();
    haveBackground = false;
  }


  /*
   * Resize
   */
  function resize(group, activeAnchor) {
    var tl = group.get(".tl")[0];
    var tr = group.get(".tr")[0];group
    var br = group.get(".br")[0];
    var bl = group.get(".bl")[0];
    var handle = group.get(".handle")[0];
    var ghost = group.get(".ghost")[0];
    var flip = group.get(".flip")[0];
    var image = group.get(".image")[0];

    switch (activeAnchor.attrs.name) {
      case "tl":
        bl.setPosition(tl.attrs.x, br.attrs.y);
        tr.setPosition(br.attrs.x, tl.attrs.y);
        break;
      case "tr":
        br.setPosition(tr.attrs.x, bl.attrs.y);
        tl.setPosition(bl.attrs.x, tr.attrs.y);
        break;
      case "bl":
        br.setPosition(tr.attrs.x, bl.attrs.y);
        tl.setPosition(bl.attrs.x, tr.attrs.y);
        break;
      case "br":
        bl.setPosition(tl.attrs.x, br.attrs.y);
        tr.setPosition(br.attrs.x, tl.attrs.y);
        break;
      }

      handle.setPosition((tr.attrs.x + tl.attrs.x) / 2, tl.attrs.y - 20);
      ghost.setPosition(handle.getPosition());
      flip.setPosition((tr.attrs.x + tl.attrs.x) / 2, bl.attrs.y + 20);

      image.setPosition(tl.attrs.x, tl.attrs.y);
      image.attrs.width = tr.attrs.x - tl.attrs.x;
      image.attrs.height = bl.attrs.y - tl.attrs.y;
  }


  /*
   * Rotate
   */
  function rotate(group) {
    var c = group.getAbsolutePosition();
    var p0 = {x: c.x, y: c.y - 50};
    var p1 = stage.getUserPosition();

    var p0c = Math.sqrt(Math.pow(c.x-p0.x,2) + Math.pow(c.y-p0.y,2)); // p0->c (b)   
    var p1c = Math.sqrt(Math.pow(c.x-p1.x,2) + Math.pow(c.y-p1.y,2)); // p1->c (a)
    var p0p1 = Math.sqrt(Math.pow(p1.x-p0.x,2) + Math.pow(p1.y-p0.y,2)); // p0->p1 (c)

    var deg =  Math.acos((p1c*p1c+p0c*p0c-p0p1*p0p1)/(2*p1c*p0c));

    // fix for negative rotation
    if(p1.x < c.x) {
      deg = (360 * (Math.PI/180)) - deg;
    }
    group.setRotation(deg);
  }


  /*
   * Flip
   */
  function flip(group) {
    group.attrs.scale.x = group.attrs.scale.x * -1;
  }


  /*
   * Fix center offset (due to resizing from a corner)
   */
  function fixCenterOffset(group) {
    var image = group.get(".image")[0]
    var currentOffset = group.getCenterOffset();
    var currentPosition = group.getPosition();
    var newOffset = {x: image.attrs.width /2, y: image.attrs.height /2};
    var newPosition = {
      x: currentPosition.x - (currentOffset.x - newOffset.x),
      y: currentPosition.y - (currentOffset.y - newOffset.y)
    }

    group.setCenterOffset(newOffset);
    group.setPosition(newPosition);
    layer.draw();
  }





  /*
   * Add an image plus anchors to the canvas using group
   */
  function initImage(img, type) {

      var kimggroup = initNormalImage(img);

    layer.add(kimggroup);
    stage.add(layer);

    // Draw the img
    stage.draw();
  }


  /*
   * Add normal image
   */
  function initNormalImage(img) {

    var kimggroup = new Kinetic.Group({
      x: stage.attrs.width / 2,
      y: stage.attrs.height / 2,
      draggable: true,
      centerOffset: [img.width/2, img.height/2]
    });

    // Make the img and add it to the group
    var kimg = new Kinetic.Image({
      x: 0,
      y: 0,
      image: img,
      width: img.width,
      height: img.height,
      name: "image"
    });
    kimggroup.add(kimg);        

    // Add anchors for resizing and rotation
    addAnchor(kimggroup, 0, 0, "tl");
    addAnchor(kimggroup, img.width, 0, "tr");
    addAnchor(kimggroup, img.width, img.height, "br");
    addAnchor(kimggroup, 0, img.height, "bl");
    addAnchor(kimggroup, img.width / 2, -20, "handle");
    addAnchor(kimggroup, img.width / 2, -20,  "ghost");
    addAnchor(kimggroup, img.width / 2, img.height +20,  "flip");

    // On click make the image selected
    kimggroup.on("mousedown", function() {
      wasSelected = selected;
      selected = this;
      updateSelected();
      this.moveToTop();
      stage.draw();
    });

    kimg.on("mouseover", function() {
      document.body.style.cursor = "move";
    });

    kimg.on("mouseout", function() {
      document.body.style.cursor = "default";
    });

    // Double click to remove
    kimg.on("dblclick dbltap", function() {
      layer.remove(kimggroup);
      layer.draw();
    });

    return kimggroup;
  }


  /*
   * Create anchor and add to group
   */
  function addAnchor(group, x, y, name) {
    var config = {
      x: x,
      y: y,
      stroke: "#000", 
      fill: "#000", 
      strokeWidth: 1, 
      radius: 4, 
      name: name, 
      draggable: true
    }
    switch (name) {
      case "handle":
        config.draggable = false;
        var anchor = addRotateAnchor(group, config);
        break;
      case "ghost":
        config.stroke = "#993333";
        var anchor = addRotateGhostAnchor(group, config);
        break;
      case "flip":
        config.stroke = "#0000ff";
        config.draggable = false;
        var anchor = addFlipAnchor(group, config);
        break;
      default:
        var anchor = addResizeAnchor(group, config);
        break;
    }
    anchor.hide();
    group.add(anchor);
  }

  /*
   * Set up resize anchor
   */
  function addResizeAnchor(group, config) {
    var anchor = new Kinetic.Circle(config);

    anchor.on("dragmove", function() {
      resize(group, this);
      layer.draw();
    });
    anchor.on("mousedown touchstart", function() {
      group.draggable(false);
      this.moveToTop();
    });
    anchor.on("dragend", function() {
      fixCenterOffset(group);
      group.draggable(true);
      layer.draw();
    });

    anchor.on("mouseover", function() {
      var layer = this.getLayer();
      document.body.style.cursor = "pointer";
      this.setStrokeWidth(3);
      layer.draw();
    });
    anchor.on("mouseout", function() {
      var layer = this.getLayer();
      document.body.style.cursor = "default";
      this.setStrokeWidth(2);
      layer.draw();
    });
    return anchor;
  }

  /*
   * Set up rotation anchor
   */
  function addRotateAnchor(group, config) {
    var anchor = new Kinetic.Circle(config);

    anchor.on("mouseover", function() {
      var layer = this.getLayer();
      document.body.style.cursor = "pointer";
      this.setStrokeWidth(3);
      layer.draw();
    });
    anchor.on("mouseout", function() {
      var layer = this.getLayer();
      document.body.style.cursor = "default";
      this.setStrokeWidth(2);
      layer.draw();
    });
    return anchor;
  }

  /*
   * Set up rotation ghost anchor
   */
  function addRotateGhostAnchor(group, config) {
    var anchor = new Kinetic.Circle(config);

    anchor.on("dragmove", function() {
      rotate(group);
      layer.draw();
    });
    anchor.on("mousedown touchstart", function() {
      group.draggable(false);
      this.moveToTop();
    });
    anchor.on("dragend", function() {
      var handle = group.get(".handle")[0];
      this.setPosition(handle.getPosition());
      group.draggable(true);
      layer.draw();
    });

    anchor.on("mouseover", function() {
      var layer = this.getLayer();
      document.body.style.cursor = "pointer";
      this.setStrokeWidth(3);
      layer.draw();
    });
    anchor.on("mouseout", function() {
      var layer = this.getLayer();
      document.body.style.cursor = "default";
      this.setStrokeWidth(2);
      layer.draw();
    });
    return anchor;
  }

  /*
   * Set up flip anchor
   */
  function addFlipAnchor(group, config) {
    var anchor = new Kinetic.Circle(config);

    anchor.on("mousedown touchstart", function() {
      flip(group);
      layer.draw();
    });

    anchor.on("mouseover", function() {
      var layer = this.getLayer();
      document.body.style.cursor = "pointer";
      this.setStrokeWidth(3);
      layer.draw();
    });
    anchor.on("mouseout", function() {
      var layer = this.getLayer();
      document.body.style.cursor = "default";
      this.setStrokeWidth(2);
      layer.draw();
    });
    return anchor;
  }


/*
 * Show anchors only when group selected
 */
  function updateSelected() {
      // Deselect the old img if there was any
      if (wasSelected) {
          wasSelected.get(".tl")[0].hide();
          wasSelected.get(".tr")[0].hide();
          wasSelected.get(".br")[0].hide();
          wasSelected.get(".bl")[0].hide();
          wasSelected.get(".handle")[0].hide();
          wasSelected.get(".ghost")[0].hide();
    wasSelected.get(".flip")[0].hide();
      }

      // Select the new image
      selected.get(".tl")[0].show();
      selected.get(".tr")[0].show();
      selected.get(".br")[0].show();
      selected.get(".bl")[0].show();
      selected.get(".handle")[0].show();
      selected.get(".ghost")[0].show();
  selected.get(".flip")[0].show();
 }


  /*
   * Add clicked images to the canvas
   */
  function addClickedImage(name) {
    console.log(document.getElementById(name).getAttribute("src"));
    var newImg = new Image();
    newImg.src = document.getElementById(name).getAttribute("src");
    //var img = document.getElementById(name);
    initImage(newImg, "normal"); 
  }


  /*
   * Listen for images dragged into canvas and add them
   */
  function setupDragAndDrop() {
    stage.content.addEventListener("dragover", function (evt) {
      evt.preventDefault();
    }, false);

    // Handle dropped image file - only Firefox and Google Chrome
    stage.content.addEventListener("drop", function (evt) {
      dragImg = new Image();
      var files = evt.dataTransfer.files;
      if (files.length > 0) {
        var file = files[0];
        if (typeof FileReader !== "undefined" && file.type.indexOf("image") != -1) {
          var reader = new FileReader();
          reader.onload = function (evt) {
            dragImg.src = evt.target.result;
          };
          reader.readAsDataURL(file);
          dragImg.onload = function(){
              var type = "normal";
            initImage(this, type);
          }
        }
      }
      evt.preventDefault();
    }, false);
  }



  window.onload = function() {
    initCanvas("container");
    setupDragAndDrop();
  };

  //upload images

       function readURL(input) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();

            reader.onload = function (e) {
                $('#addimg')
                    .attr('src', e.target.result)
                    .width(150)
                    .height(200);
            };

            reader.readAsDataURL(input.files[0]);
        }
    }

0 个答案:

没有答案