2013-09-30 9 views
10

Ich erstelle einen HTML5-Canvas-Bildbearbeitungsprogramm. Nachdem ich ein Bild in den Canvas hochgeladen habe, muss ich es ziehen und die Größe über die Leinwand ändern. Ich habe es geschafft, ein Bild hochzuladen und es auf der Leinwand ziehen zu lassen. Aber ich muss es auch entlang der Leinwand in der Größe veränderbar machen. Danke im Voraus.Ziehen und Ändern der Größe eines Bildes auf html5-Canvas

var Img = new Image(); 
Img.src = file; 
Img.onload = function() { 
    context.drawImage(Img, 50, 0, 200, 200); 
} 
mouseMove = function (event){ 
if (down) 
{ 
context.clearRect(0,0,800,500); 
context.translate(0, -50); 
context.drawImage(Img, (event.clientX - offsetX), 
(event.clientY - offsetY), 200, 200); 
context.translate(0, 50); 
} 
} 
mouseUp = function() { 
    down = false; 
} 
mouseDown = function() { 
    down = true; 
} 
canvas.addEventListener('mousedown', mouseDown, false); 
canvas.addEventListener('mouseup', mouseUp, false); 
canvas.addEventListener('mousemove',mouseMove, false); 

Ich versuchte mit Kinetics js, aber es ist nicht mit Canvas geeignet.

Antwort

24

Hier ist ein Beispielcode, mit dem Sie ein Bild mithilfe von Canvas ziehen und seine Größe ändern können.

Ändern der Größe

enter image description hereenter image description here

Wie ein Bild mit 4 ziehbar Anker an jeder Ecke eines Bildes

  • Zeichnen Sie ein ziehbar Anker ändern.
  • Wenn der Benutzer mousedown der Anker ist, fangen Sie an, diesen Anker zu ziehen.
  • Ändern Sie die Größe des Bildes im Mauszeiger-Handler mit der Position des ziehenden Ankers (Hinweis unten).
  • Als letzte Aktion in mousemove, zeichnen Sie das skalierte Bild und 4 neue Anker neu.
  • Halten Sie bei Mouseup den Anker ziehen.

Hinweis auf der Mathematik verwendet, um das Bild zu skalieren:

  • Die skalierte Breite ist die Differenz zwischen der mouseX Position und X. die gegenüberliegenden Ecke
  • Die Größe veränderte Höhe ist die Differenz zwischen dem mouseY Position und die gegenüberliegende Ecke des Y.

Ziehen

enter image description hereenter image description here

Wie ein Bild

  • Wenn der Benutzer mousedown- die innerhalb des Bildes ziehen, um die Mäuse beginnen XY speichern Ziehen zu beginnen.
  • Verschieben Sie das Bild im MouseMove-Handler mit der aktuellen MausXY minus dem StartXY.
  • Auch in mousemove, setzen Sie die startingXY auf die aktuelle mouseXY in Vorbereitung für das weitere Ziehen.
  • Halten Sie bei Mouseup den Ziehvorgang des Bildes an.

Hier Code und ein Fiddle: http://jsfiddle.net/m1erickson/LAS8L/

<!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> 

<style> 
    body{ background-color: ivory; padding:10px;} 
    #canvas{border:1px solid red;} 
</style> 

<script> 
$(function(){ 

    var canvas=document.getElementById("canvas"); 
    var ctx=canvas.getContext("2d"); 

    var canvasOffset=$("#canvas").offset(); 
    var offsetX=canvasOffset.left; 
    var offsetY=canvasOffset.top; 

    var startX; 
    var startY; 
    var isDown=false; 


    var pi2=Math.PI*2; 
    var resizerRadius=8; 
    var rr=resizerRadius*resizerRadius; 
    var draggingResizer={x:0,y:0}; 
    var imageX=50; 
    var imageY=50; 
    var imageWidth,imageHeight,imageRight,imageBottom; 
    var draggingImage=false; 
    var startX; 
    var startY; 



    var img=new Image(); 
    img.onload=function(){ 
     imageWidth=img.width; 
     imageHeight=img.height; 
     imageRight=imageX+imageWidth; 
     imageBottom=imageY+imageHeight 
     draw(true,false); 
    } 
    img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/facesSmall.png"; 


    function draw(withAnchors,withBorders){ 

     // clear the canvas 
     ctx.clearRect(0,0,canvas.width,canvas.height); 

     // draw the image 
     ctx.drawImage(img,0,0,img.width,img.height,imageX,imageY,imageWidth,imageHeight); 

     // optionally draw the draggable anchors 
     if(withAnchors){ 
      drawDragAnchor(imageX,imageY); 
      drawDragAnchor(imageRight,imageY); 
      drawDragAnchor(imageRight,imageBottom); 
      drawDragAnchor(imageX,imageBottom); 
     } 

     // optionally draw the connecting anchor lines 
     if(withBorders){ 
      ctx.beginPath(); 
      ctx.moveTo(imageX,imageY); 
      ctx.lineTo(imageRight,imageY); 
      ctx.lineTo(imageRight,imageBottom); 
      ctx.lineTo(imageX,imageBottom); 
      ctx.closePath(); 
      ctx.stroke(); 
     } 

    } 

    function drawDragAnchor(x,y){ 
     ctx.beginPath(); 
     ctx.arc(x,y,resizerRadius,0,pi2,false); 
     ctx.closePath(); 
     ctx.fill(); 
    } 

    function anchorHitTest(x,y){ 

     var dx,dy; 

     // top-left 
     dx=x-imageX; 
     dy=y-imageY; 
     if(dx*dx+dy*dy<=rr){ return(0); } 
     // top-right 
     dx=x-imageRight; 
     dy=y-imageY; 
     if(dx*dx+dy*dy<=rr){ return(1); } 
     // bottom-right 
     dx=x-imageRight; 
     dy=y-imageBottom; 
     if(dx*dx+dy*dy<=rr){ return(2); } 
     // bottom-left 
     dx=x-imageX; 
     dy=y-imageBottom; 
     if(dx*dx+dy*dy<=rr){ return(3); } 
     return(-1); 

    } 


    function hitImage(x,y){ 
     return(x>imageX && x<imageX+imageWidth && y>imageY && y<imageY+imageHeight); 
    } 


    function handleMouseDown(e){ 
     startX=parseInt(e.clientX-offsetX); 
     startY=parseInt(e.clientY-offsetY); 
     draggingResizer=anchorHitTest(startX,startY); 
     draggingImage= draggingResizer<0 && hitImage(startX,startY); 
    } 

    function handleMouseUp(e){ 
     draggingResizer=-1; 
     draggingImage=false; 
     draw(true,false); 
    } 

    function handleMouseOut(e){ 
     handleMouseUp(e); 
    } 

    function handleMouseMove(e){ 

     if(draggingResizer>-1){ 

      mouseX=parseInt(e.clientX-offsetX); 
      mouseY=parseInt(e.clientY-offsetY); 

      // resize the image 
      switch(draggingResizer){ 
       case 0: //top-left 
        imageX=mouseX; 
        imageWidth=imageRight-mouseX; 
        imageY=mouseY; 
        imageHeight=imageBottom-mouseY; 
        break; 
       case 1: //top-right 
        imageY=mouseY; 
        imageWidth=mouseX-imageX; 
        imageHeight=imageBottom-mouseY; 
        break; 
       case 2: //bottom-right 
        imageWidth=mouseX-imageX; 
        imageHeight=mouseY-imageY; 
        break; 
       case 3: //bottom-left 
        imageX=mouseX; 
        imageWidth=imageRight-mouseX; 
        imageHeight=mouseY-imageY; 
        break; 
      } 

      // enforce minimum dimensions of 25x25 
      if(imageWidth<25){imageWidth=25;} 
      if(imageHeight<25){imageHeight=25;} 

      // set the image right and bottom 
      imageRight=imageX+imageWidth; 
      imageBottom=imageY+imageHeight; 

      // redraw the image with resizing anchors 
      draw(true,true); 

     }else if(draggingImage){ 

      imageClick=false; 

      mouseX=parseInt(e.clientX-offsetX); 
      mouseY=parseInt(e.clientY-offsetY); 

      // move the image by the amount of the latest drag 
      var dx=mouseX-startX; 
      var dy=mouseY-startY; 
      imageX+=dx; 
      imageY+=dy; 
      imageRight+=dx; 
      imageBottom+=dy; 
      // reset the startXY for next time 
      startX=mouseX; 
      startY=mouseY; 

      // redraw the image with border 
      draw(false,true); 

     } 


    } 


    $("#canvas").mousedown(function(e){handleMouseDown(e);}); 
    $("#canvas").mousemove(function(e){handleMouseMove(e);}); 
    $("#canvas").mouseup(function(e){handleMouseUp(e);}); 
    $("#canvas").mouseout(function(e){handleMouseOut(e);}); 


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

</head> 

<body> 
    <p>Resize the image using the 4 draggable corner anchors</p> 
    <p>You can also drag the image</p> 
    <canvas id="canvas" width=350 height=350></canvas> 
</body> 
</html> 

auch:

Simon Sarris hat ein nettes Tutorial gemacht, wie man ziehen und die Größe "Elemente" auf HTML-Leinwand.

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

+0

ich es versucht, aber nicht in der Lage es mit Zeichnung Bild mit ‚context.DrawImage‘ arbeiten zu machen. Kannst du mir helfen, Bilder anstatt Rechtecke durch Bearbeiten von Simson Sarris Code zu zeichnen. –

+1

Ich habe meine Antwort mit ein paar Drag/Resize Code hinzugefügt. – markE

+1

Vielen Dank für Ihre Hilfe. Sie sind immer sehr hilfreich. Möge Gott dich segnen. –

Verwandte Themen