【问题标题】:dragging and resizing an image on html5 canvas在 html5 画布上拖动图像并调整其大小
【发布时间】:2013-10-06 15:47:34
【问题描述】:

我正在构建一个 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,但它不适合画布。

【问题讨论】:

    标签: javascript html5-canvas


    【解决方案1】:

    这里的示例代码允许您使用 Canvas 拖动图像并调整其大小。

    调整大小

    如何使用 4 个可拖动的锚点调整图像大小

    • 在图像的每个角上绘制一个可拖动的锚点。
    • 如果用户 mousedown 是锚点,则开始拖动该锚点。
    • 在 mousemove 处理程序中,使用拖动锚点的位置调整图像大小(注意如下)。
    • 作为 mousemove 的最后一幕,重绘调整大小的图像和 4 个新锚点。
    • 在 mouseup 时,停止锚点的拖动。

    注意用于调整图像大小的数学:

    • 调整后的宽度是 mouseX 位置与对角 X 之间的差异。
    • 调整后的高度是鼠标 Y 位置与对角 Y 位置之间的差值。

    拖动

    如何拖动图片

    • 如果用户 mousedown 在图像内,则保存鼠标从 XY 开始拖动。
    • 在 mousemove 处理程序中,将图像移动当前 mouseXY 减去起始XY。
    • 同样在 mousemove 中,将startingXY 重置为当前的mouseXY 以准备继续拖动。
    • 在 mouseup 时,停止拖动图像。

    这是代码和小提琴: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>
    

    【讨论】:

    • 我尝试过使用它,但无法使用“context.DrawImage”使其与绘图图像一起使用。你能通过编辑 simson sarris 代码来帮助我通过绘制图像而不是矩形来帮助我吗?
    • 非常感谢您的帮助。你总是很有帮助。愿上帝保佑你。
    • 我很想知道如何在图像上实现旋转事件。
    • 上下文将旋转您的图像+调整器。但是在鼠标处理程序中进行命中测试时,您必须取消旋转 mouseXY(因为 XY 是在未旋转的空间中给出的)所以...旋转绘图:ctx.save(); ctx.rotate(radianAngle); // 正常绘制图像和调整大小 ctx.restore();但是在您的鼠标事件中,您必须通过取消旋转 mouseXY 来跟踪图像和调整大小: unrotatedX=centerX+mouseXMath.cos(-radianAngle)-mouseYMath.sin(-radianAngle ); unrotatedY=centerY-mouseXMath.sin(-radianAngle)-mouseYMath.cos(-radianAngle);
    • 我尽我所能,使用您的建议在您的小提琴中的上述代码中实现旋转功能。但我无法成功。可能是因为我的经验不足。你能帮我把旋转的代码也添加到小提琴中吗?
    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2017-04-29
    • 2011-01-19
    • 2020-08-09
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多