2013-09-30 9 views
10

Buduję edytor obrazów canvas5. Po wgraniu obrazu na płótno należy przeciągnąć i zmienić jego rozmiar na płótnie. Udało mi się przesłać obraz i uczynić go przeciągalnym na płótnie. Ale muszę zmienić rozmiar również wzdłuż płótna. Z góry dziękuję.przeciąganie i zmienianie rozmiaru obrazu na płótnie html5

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); 

Próbowałem z kinetyką, ale nie nadaje się do płótna.

Odpowiedz

24

Oto przykład kodu, który umożliwia przeciąganie i zmienianie rozmiaru obrazu przy użyciu Canvas.

Zmiana rozmiaru

enter image description hereenter image description here

Jak zmienić rozmiar obrazu z 4 Draggable kotew

  • Narysuj Draggable kotwicę na każdym rogu obrazu.
  • Jeśli użytkownik poda mousedown, jeśli jest kotwicami, zacznij przeciągać tę kotwicę.
  • W manipulatorze myszy zmień rozmiar obrazu za pomocą pozycji kotwicy przeciągania (uwaga poniżej).
  • Jako ostatni akt w myszy, przerysuj obraz o zmienionym rozmiarze i 4 nowe kotwice.
  • Po najechaniu myszką, zatrzymaj przeciągnięcie kotwicy.

Uwaga na matematyce stosowanej do zmiany rozmiaru obrazu:

  • o zmienionym szerokość jest różnica między pozycją mouseX i przeciwległym rogu za X.
  • Zmniejszone wysokość jest równa różnicy między mouseY pozycja i Y. przeciwległym rogu za

Przeciąganie

enter image description hereenter image description here

Jak przeciągnąć obraz

  • Jeśli mousedown autora wewnątrz obrazu, zapisz mouses począwszy XY, aby rozpocząć przeciąganie.
  • W manipulatorze myszy przesuń obraz o bieżący mouseXY minus początkowy XY.
  • Również w trybie przesunięcia myszy, zresetuj startXY do bieżącego mouseXY w ramach przygotowań do ciągłego przeciągania.
  • Po najechaniu myszką zatrzymaj przeciąganie obrazu.

Oto kod i 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> 

również:

Simon Sarris zrobiła piękny tutorial jak przeciągnij i rozmiaru "elementy" HTML płótnie.

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

+0

Próbowałem z nim, ale nie jest w stanie zrobić to praca z rysunku obraz za pomocą „context.DrawImage”. Czy możesz mi pomóc, rysując obrazy zamiast prostokąty, edytując kod simsona sarris. –

+1

Dodałem do mojej odpowiedzi przykładowy kod przeciągania/zmiany rozmiaru. – markE

+1

Dziękuję bardzo za pomoc. Zawsze jesteś bardzo pomocny. Niech Bóg Cię błogosławi. –

Powiązane problemy