HTML5 Canvas - 在图像上保留绘制的矩形

时间:2018-02-06 12:22:01

标签: javascript html5 image canvas

我有一个图片库。单击图库中的图像时,它将在画布上呈现。目标是允许用户在感兴趣的区域上绘制矩形并捕获矩形坐标。当我移动到下一个图像时,绘制的矩形消失。

以下是代码,我尽可能多地发表评论:

//get clicked image name and store in a variable
function clickedImage(clicked_id) {
    var clickedImg = document.getElementById(clicked_id).src;
    var clickedImg = clickedImg.replace(/^.*[\\\/]/, '');
    localStorage.setItem("clickedImg", clickedImg);

    //initiate canvas to load image
    var canvas = document.getElementById("iriscanvas");
    var ctx = canvas.getContext("2d");
    var thumbNails = document.getElementById("loaded_img_panel");
    var pic = new Image();
    pic.onload = function() {
      ctx.drawImage(pic, 0,0)
    }
    //load the image from the thumbnail on to the canvas
    thumbNails.addEventListener('click', function(event) {
      pic.src = event.target.src;
    });

    //thickness of rectangle and count of rectangles
    var strokeWidth = 3;
    drawCount = 1;

    //initiate mouse events
    canvas.addEventListener("mousemove", function(e) {
          drawRectangleOnCanvas.handleMouseMove(e);
        }, false);

        canvas.addEventListener("mousedown", function(e) {
          drawRectangleOnCanvas.handleMouseDown(e);
        }, false);
        canvas.addEventListener("mouseup", function(e) {
          drawRectangleOnCanvas.handleMouseUp(e);
        }, false);
        canvas.addEventListener("mouseout", function(e) {
          drawRectangleOnCanvas.handleMouseOut(e);
        }, false);

        function reOffset() {
          var BB = canvas.getBoundingClientRect();
          recOffsetX = BB.left;
          recOffsetY = BB.top;
        }
        var recOffsetX, recOffsetY;
        reOffset();

        window.onscroll = function(e) {
          reOffset();
        }

        window.onresize = function(e) {
          reOffset();
        }

        var isRecDown = false;
        var startX, startY;

        var rects = [];
        var newRect;

        var drawRectangleOnCanvas = {
          handleMouseDown: function(e) {
            // tell the browser we're handling this event
            e.preventDefault();
            e.stopPropagation();

            startX = parseInt(e.clientX - recOffsetX);
            startY = parseInt(e.clientY - recOffsetY);

            // Put your mousedown stuff here
            isRecDown = true;
          },

          handleMouseUp: function(e) {
            // tell the browser we're handling this event
            e.preventDefault();
            e.stopPropagation();

            mouseX = parseInt(e.clientX - recOffsetX);
            mouseY = parseInt(e.clientY - recOffsetY);

            // Put your mouseup stuff here
            isRecDown = false;

            //if(!willOverlap(newRect)){
            rects.push(newRect);
            //}

            drawRectangleOnCanvas.drawAll();
            var brand = localStorage.getItem("brandNode");
            var clickImg = localStorage.getItem("clickedImg");

            //get x,y,w,h coordinates depending on how the rectangle is drawn.

            if((mouseX-startX) < 0) {
                stX = startX + (mouseX-startX)
            } else {
                stX = startX
            }

            if((mouseY-startY) < 0) {
                stY = startY + (mouseY-startY)
            } else {
                stY = startY
            }

            if((mouseX-startX) < 0) {
                stW = startX - stX
            } else {
                stW = mouseX - startX
            }

            if((mouseY-startY) < 0) {
                stH = startY - stY
            } else {
                stH = mouseY - startY
            }
            //log the coordinates of the rectangles
            var dat = {image : clickImg, brand: brand, x : stX, y : stY, w: stW, h: stH};
            var dat = JSON.stringify(dat);    
            console.log(dat);
          },

          drawAll: function() {
            ctx.drawImage(pic, 0, 0);
            ctx.lineWidth = strokeWidth;
            var brand = localStorage.getItem("brandNode");
            for (var i = 0; i < rects.length; i++) {

              var r = rects[i];
              ctx.strokeStyle = r.color;
              ctx.globalAlpha = 1;
              ctx.strokeRect(r.left, r.top, r.right - r.left, r.bottom - r.top);

              ctx.beginPath();
              //ctx.arc(r.left, r.top, 15, 0, Math.PI * 2, true);
              ctx.closePath();
              ctx.fillStyle = r.color;
              ctx.fill();

              var text = brand;
              ctx.fillStyle = "#fff";
              var font = "bold " + 12 + "px serif";
              ctx.font = font;
              var width = ctx.measureText(text).width;
              var height = ctx.measureText("h").height; // this is a GUESS of height
              ctx.fillText(text, r.left-1, r.top - 10)

            }
          },

          handleMouseOut: function(e) {
            // tell the browser we're handling this event
            e.preventDefault();
            e.stopPropagation();

            mouseX = parseInt(e.clientX - recOffsetX);
            mouseY = parseInt(e.clientY - recOffsetY);

            // Put your mouseOut stuff here
            isRecDown = false;
          },

          handleMouseMove: function(e) {
            if (!isRecDown) {
              return;
            }
            // tell the browser we're handling this event
            e.preventDefault();
            e.stopPropagation();

            mouseX = parseInt(e.clientX - recOffsetX);
            mouseY = parseInt(e.clientY - recOffsetY);
            newRect = {
              left: Math.min(startX, mouseX),
              right: Math.max(startX, mouseX),
              top: Math.min(startY, mouseY),
              bottom: Math.max(startY, mouseY),
              color: "#9afe2e"
            }
            drawRectangleOnCanvas.drawAll();
            ctx.strokeStyle = "#9afe2e";
            ctx.lineWidth = strokeWidth;
            ctx.globalAlpha = 1;
            ctx.strokeRect(startX, startY, mouseX - startX, mouseY - startY);
          }
        }       
}

当我移动到下一个图像时,将删除在上一个图像上创建的矩形。我不知道是否必须使用canvas.toDataURL来保留矩形,因为我在图库中有数千张图片,并且不确定我是否会在浏览器中占用空间,但并非所有图像都会显示用于绘制矩形。

此外,在我点击同一图像后绘制矩形后,它会清除所有矩形。

如何至少在会话中保留绘制的矩形?

1 个答案:

答案 0 :(得分:0)

第2层画布相互重叠。将图像渲染到底部画布中,并在顶部画布上绘制。这样,更改图像不会影响绘制的线条。

<canvas>就像现实生活画家的画布一样。画布上没有层或“对象”的概念。它只是在一个表面上绘画。

当您在画布上绘制不同的图像时,您将覆盖画布上的所有内容。