2013-09-30 6 views
10

Я создаю редактор изображений холста HTML5. После загрузки изображения на холст мне нужно перетащить и изменить его размер над холстом. Мне удалось загрузить изображение и сделать его перетаскиваемым на холст. Но мне нужно сделать его изменчивым и вдоль холста. Заранее спасибо.Перетаскивание и изменение размера изображения на холсте 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); 

Я пробовал с кинетикой js, но не подходит для холста.

ответ

24

Вот пример кода, позволяющий перетаскивать и изменять размер изображения с помощью Canvas.

Изменение размера

enter image description hereenter image description here

Как изменить размер изображения с 4 перемещаемых якорями

  • Нарисуйте перемещаемый якорь на каждый углу изображения.
  • Если пользователь mousedown один, если якоря, начните перетаскивать этот якорь.
  • В обработчике mousemove измените размер изображения с помощью положения перетаскивания якоря (Примечание ниже).
  • Как последнее действие в mousemove, перерисовать измененное изображение и 4 новых якоря.
  • На мышке остановите привязку якоря.

Примечания по математике, используемой для изменения размера изображения:

  • После изменения размера шириной разница между положением mouseX и противоположным углом в X.
  • с измененным размером по высоте разница между мышиным положение и Y. противоположном углу по

Перетаскивание

enter image description hereenter image description here

Как перетащить изображение

  • Если MouseDown пользователя внутри изображения, сохранить мышей начиная с XY, чтобы начать перетаскивание.
  • В обработчике mousemove переместите изображение с помощью текущего mouseXY минус startXY.
  • Также в mousemove сбросьте startXY к текущему mouseXY в рамках подготовки к продолжению перетаскивания.
  • На мышке остановить перетаскивание изображения.

Вот код и 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> 

также:

Simon Sarris сделал хороший учебник о том, как перетащить и изменить размер "элементов" на HTML холсте.

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

+0

Я пытался с ним, но не в состоянии сделать его работу с нанесением изображения, используя «context.DrawImage». Можете ли вы помочь мне перерисовывать изображения, а не прямоугольники, редактируя код simson sarris. –

+1

Я добавил к своему ответу в каком-то примере код перетаскивания/изменения размера. – markE

+1

Большое спасибо за вашу помощь. Вы всегда очень помогаете. Да благословит тебя Бог. –

Смежные вопросы