Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可以在画布中拖动图像,也可以在同一画布上绘制图像吗?_Javascript_Html_Canvas - Fatal编程技术网

Javascript 可以在画布中拖动图像,也可以在同一画布上绘制图像吗?

Javascript 可以在画布中拖动图像,也可以在同一画布上绘制图像吗?,javascript,html,canvas,Javascript,Html,Canvas,在这里,我尝试在html5画布上绘制,并上传一些图像并将它们拖动到画布中。问题是我可以做其中一个,但不能同时做两个。 我意识到,在拖动之前必须清除画布,但这样做是在清除绘图,如果我不清除画布,它会绘制,但拖动图像会留下痕迹。谁能给我指一下正确的方向吗 function init() { canvas = document.getElementById('can'); ctx = canvas.getContext("2d"); w

在这里,我尝试在html5画布上绘制,并上传一些图像并将它们拖动到画布中。问题是我可以做其中一个,但不能同时做两个。 我意识到,在拖动之前必须清除画布,但这样做是在清除绘图,如果我不清除画布,它会绘制,但拖动图像会留下痕迹。谁能给我指一下正确的方向吗

        function init() {
        canvas = document.getElementById('can');
        ctx = canvas.getContext("2d");
        w = canvas.width;
        h = canvas.height;
        img = document.getElementById("drag");

        canvas.addEventListener("mousemove", function (e) { findxy('move', e) }, false);
        canvas.addEventListener("mousedown", function (e) { findxy('down', e) }, false);
        canvas.addEventListener("mouseup", function (e) {  findxy('up', e) }, false);
        canvas.addEventListener("mouseout", function (e) { findxy('out', e) }, false);

        imageLoader = document.getElementById('imageLoader');
        imageLoader.addEventListener('change', handleImage, false);

        var contexts = [];
        contexts.push(canvas.getContext('2d'));

        function clearAll() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
        }

       canvas.onclick = function (e) { handleClick(e, 1); };

        function handleClick(e, contextIndex) {
            e.stopPropagation();
            var mouseX = parseInt(e.clientX - e.target.offsetLeft);
            var mouseY = parseInt(e.clientY - e.target.offsetTop);
        //    clearAll();
            for (var i = 0; i < states.length; i++) {

                var state = states[i];
                if (state.dragging) {
                    state.dragging = false;
                    state.draw();
                    continue;
                }

                if (state.contextIndex === contextIndex
                        && mouseX > state.x && mouseX < state.x + state.width
                        && mouseY > state.y && mouseY < state.y + state.height)
                {
                    state.dragging = true;
                    state.offsetX = mouseX - state.x;
                    state.offsetY = mouseY - state.y;
                    state.contextIndex = contextIndex;
                }
                state.draw();
            }
        }
        canvas.onmousemove = function (e) { handleMousemove(e, 1); }

        function handleMousemove(e, contextIndex) {
            e.stopPropagation();

            var mouseX = parseInt(e.clientX - e.target.offsetLeft);
            var mouseY = parseInt(e.clientY - e.target.offsetTop);

        //    clearAll();

            for (var i = 0; i < states.length; i++) {

                var state = states[i];

                if (state.dragging) {
                    state.x = mouseX - state.offsetX;
                    state.y = mouseY - state.offsetY;
                    state.contextIndex = contextIndex;
                }
                state.draw();
            }
        }
       var states = [];
        states.push(addState(0, 0, img));

        function addState(x, y, image) {
            state = {}
            state.dragging = false;
            state.contextIndex = 1;
            state.image = image;
            state.x = x;
            state.y = y;
            state.width = image.width;
            state.height = image.height;
            state.offsetX = 0;
            state.offsetY = 0;
            state.draw = function () {
                var context = contexts[this.contextIndex - 1];
                if (this.dragging) {
                    context.strokeStyle = 'red';
                    context.strokeRect(this.x, this.y, this.width + 5, this.height + 5);
                }
                context.drawImage(this.image, this.x, this.y);
            };
            state.draw();
            return(state);
        }

}//end of init()  

var imgArray = [];
function handleImage(e) {
    var reader = new FileReader();
    reader.onload = function (event) {
        imgArray.push(img);
        for(i = 0; i < imgArray.length; i++){
            img.src = imgArray[i];
            img.setAtX = i * 50;
            img.setAtY = i * 0;
            img.onload = function() {
                ctx.drawImage(this, this.setAtX, this.setAtY);
            };
            img.src = event.target.result;
        }
    };
    reader.readAsDataURL(e.target.files[0]);                
}
    function findxy(res, e) {
        if (res === 'down') {
            prevX = currX;
            prevY = currY;
            currX = e.clientX - canvas.offsetLeft;
            currY = e.clientY - canvas.offsetTop;

            flag = true;
            dot_flag = true;
            if (dot_flag) {
                ctx.beginPath();
                ctx.fillStyle = x;
                ctx.fillRect(currX, currY, 2, 2);
                ctx.closePath();
                dot_flag = false;
            }
        }
        if (res === 'up' || res === "out") {
            flag = false;
        }
        if (res === 'move') {
            if (flag) {
                prevX = currX;
                prevY = currY;
                currX = e.clientX - canvas.offsetLeft;
                currY = e.clientY - canvas.offsetTop;
                draw();
            }
        }
    }

    //Draw lines or text 
    function draw() {
        ctx.beginPath();
        ctx.moveTo(prevX, prevY);
        ctx.lineTo(currX, currY);
        ctx.strokeStyle = x;
        ctx.lineWidth = y;
        ctx.stroke();
        ctx.closePath();           
        ctx.fillStyle = x;           
        ctx.font = "Italic Bold 14pt Times, serif";            
        ctx.fillText(message, prevX, prevY);
    }
函数init(){
canvas=document.getElementById('can');
ctx=canvas.getContext(“2d”);
w=画布宽度;
h=画布高度;
img=document.getElementById(“拖动”);
addEventListener(“mousemove”,函数(e){findxy('move',e)},false);
addEventListener(“mousedown”,函数(e){findxy('down',e)},false);
addEventListener(“mouseup”,函数(e){findxy('up',e)},false);
addEventListener(“mouseout”,函数(e){findxy('out',e)},false);
imageLoader=document.getElementById('imageLoader');
imageLoader.addEventListener('change',handleImage,false);
var上下文=[];
push(canvas.getContext('2d');
函数clearAll(){
clearRect(0,0,canvas.width,canvas.height);
}
canvas.onclick=函数(e){handleClick(e,1);};
函数handleClick(e,contextIndex){
e、 停止传播();
var mouseX=parseInt(e.clientX-e.target.offsetLeft);
var mouseY=parseInt(e.clientY-e.target.offsetTop);
//clearAll();
对于(变量i=0;istate.x&&mouseXstate.y&&mouseY
这里是我链接的代码和您自己的代码的混搭

所有与绘制图像和在画布上转换图像相关的参数都包含在内

<div id="canvasesdiv"> <canvas id="images" width=600 height=400 style="position: absolute; left: 0; top: 0; border: 1px solid blue; z-index: 1;"> This text is displayed if your browser does not support HTML5 Canvas</canvas> <canvas id="drawing" width=600 height=400 style="position: absolute; left: 0; top: 0; border: 1px solid red; z-index: 2;"> This text is displayed if your browser does not support HTML5 Canvas</canvas> <input type="file" id="imageLoader" class="imageLoader" name="imageLoader"/> <input type="image" src="images/PenForCanvas.png" alt="pen" title="Draw on canvas" id="Drawing" style="cursor: pointer; margin: 5px 0 0 200px;"> &nbsp;&nbsp;&nbsp;&nbsp; <input type="image" src="images/drag.png" alt="drag" title="Drag this image" id="Images" style="cursor: pointer;"> </div> <script> var drawing, drawingCtx,images,imagesCtx, message = "", img, imageLoader, prevX = 10, currX = 10, prevY = 10, currY = 10, dot_flag = false, flag = false, x = "black", y = 2, formElement, canvasLeft, canvasTop, imgData, data, startOffsetX = 0, startOffsetY = 0; (function () { // Drawing canvas drawing = document.getElementById("drawing"); drawingCtx = drawing.getContext("2d"); //Uploading and dragging images images = new fabric.Canvas('images'); document.getElementById('imageLoader').addEventListener("change", function (e) { var file = e.target.files[0]; var reader = new FileReader(); reader.onload = function (f) { var data = f.target.result; fabric.Image.fromURL(data, function (img) { var oImg = img.set({left: 0, top: 0, angle: 00,width:40, height:40}).scale(0.9); images.add(oImg).renderAll(); var a = images.setActiveObject(oImg); var dataURL = images.toDataURL({format: 'png', quality: 0.8}); }); }; reader.readAsDataURL(file); }); w = drawing.width; h = drawing.height; //Mouse events drawing.addEventListener("mousemove", function (e) { findxy('move', e) }, false); drawing.addEventListener("mousedown", function (e) { findxy('down', e) }, false); drawing.addEventListener("mouseup", function (e) { findxy('up', e) }, false); drawing.addEventListener("mouseout", function (e) { findxy('out', e) }, false); Drawing = document.getElementById("Drawing"); Drawing.addEventListener("click", bringDrawingToFront); Images = document.getElementById("Images"); Images.addEventListener("click", bringImagesToFront); imageLoader = document.getElementById('imageLoader'); imageLoader.addEventListener('change', bringImagesToFront); //Drawing function findxy(res, e) { if (res === 'down') { prevX = currX; prevY = currY; currX = e.clientX - drawing.offsetLeft; currY = e.clientY - drawing.offsetTop; flag = true; dot_flag = true; if (dot_flag) { drawingCtx.beginPath(); drawingCtx.fillStyle = x; drawingCtx.fillRect(currX, currY, 2, 2); drawingCtx.closePath(); dot_flag = false; } } if (res === 'up' || res === "out") { flag = false; } if (res === 'move') { if (flag) { prevX = currX; prevY = currY; currX = e.clientX - drawing.offsetLeft; currY = e.clientY - drawing.offsetTop; draw(); } } } function save() { imgData = drawingCtx.getImageData(0, 0, drawing.width, drawing.height); } function restore() { drawingCtx.putImageData(imgData, 0, 0); } function bringDrawingToFront() { drawing.style.zIndex = 1; document.getElementById("images").style.zIndex = 0; } function bringImagesToFront() { drawing.style.zIndex = 0; document.getElementById("images").style.zIndex = 1; } //Draw lines or text function draw() { drawingCtx.beginPath(); drawingCtx.moveTo(prevX, prevY); drawingCtx.lineTo(currX, currY); drawingCtx.strokeStyle = x; drawingCtx.lineWidth = y; drawingCtx.stroke(); drawingCtx.closePath(); drawingCtx.fillStyle = x; drawingCtx.font = "Italic Bold 14pt Times, serif"; drawingCtx.fillText(message, prevX, prevY); save(); } })(); </script>