【问题标题】:Canvas change size of drawings live画布实时更改图纸尺寸
【发布时间】:2017-07-28 07:32:26
【问题描述】:

我目前正在努力实现以下目标。 我有一个 HTML5 Canvas,您可以在其中进行绘制。代码是这样的:

var canvas, ctx, flag = false,
            prevX = 0,
            currX = 0,
            prevY = 0,
            currY = 0,
            dot_flag = false;
    
        var x = "black",
            y = 2;
    
        function init() {
            canvas = document.getElementById('can');
            ctx = canvas.getContext("2d");
            w = canvas.width;
            h = canvas.height;
    
            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);
        }
    
        function color(obj) {
            switch (obj.id) {
                case "green":
                    x = "green";
                    break;
                case "blue":
                    x = "blue";
                    break;
                case "red":
                    x = "red";
                    break;
                case "yellow":
                    x = "yellow";
                    break;
                case "orange":
                    x = "orange";
                    break;
                case "black":
                    x = "black";
                    break;
                case "white":
                    x = "white";
                    break;
            }
            if (x == "white") y = 14;
            else y = 2;
    
        }
    
        function draw() {
            ctx.beginPath();
            ctx.moveTo(prevX, prevY);
            ctx.lineTo(currX, currY);
            ctx.strokeStyle = x;
            ctx.lineWidth = y;
            ctx.stroke();
            ctx.closePath();
        }
    
        function erase() {
            var m = confirm("Want to clear");
            if (m) {
                ctx.clearRect(0, 0, w, h);
                document.getElementById("canvasimg").style.display = "none";
            }
        }
    
        function save() {
            document.getElementById("canvasimg").style.border = "2px solid";
            var dataURL = canvas.toDataURL();
            document.getElementById("canvasimg").src = dataURL;
            document.getElementById("canvasimg").style.display = "inline";
        }
    
        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();
                }
            }
        }
<html>
        <body onload="init()">
            <canvas id="can" width="400" height="400" style="position:absolute;top:10%;left:10%;border:2px solid;"></canvas>
            <div style="position:absolute;top:12%;left:43%;">Choose Color</div>
            <div style="position:absolute;top:15%;left:45%;width:10px;height:10px;background:green;" id="green" onclick="color(this)"></div>
            <div style="position:absolute;top:15%;left:46%;width:10px;height:10px;background:blue;" id="blue" onclick="color(this)"></div>
            <div style="position:absolute;top:15%;left:47%;width:10px;height:10px;background:red;" id="red" onclick="color(this)"></div>
            <div style="position:absolute;top:17%;left:45%;width:10px;height:10px;background:yellow;" id="yellow" onclick="color(this)"></div>
            <div style="position:absolute;top:17%;left:46%;width:10px;height:10px;background:orange;" id="orange" onclick="color(this)"></div>
            <div style="position:absolute;top:17%;left:47%;width:10px;height:10px;background:black;" id="black" onclick="color(this)"></div>
            <div style="position:absolute;top:20%;left:43%;">Eraser</div>
            <div style="position:absolute;top:22%;left:45%;width:15px;height:15px;background:white;border:2px solid;" id="white" onclick="color(this)"></div>
            <img id="canvasimg" style="position:absolute;top:10%;left:52%;" style="display:none;">
            <input type="button" value="save" id="btn" size="30" onclick="save()" style="position:absolute;top:55%;left:10%;">
            <input type="button" value="clear" id="clr" size="23" onclick="erase()" style="position:absolute;top:55%;left:15%;">
        </body>
        </html>

所以基本上只是从一个点到另一个点画线。

现在我想知道以下内容。你们中的大多数人应该知道OneNote,它有一个你可以画东西的功能,然后你会看到“哎呀,与我画的其他东西相比,这被画得大得多或小得多”,然后你就可以标记它并抓住角落,使您标记的矩形变小或变大。

我目前正在考虑在画布中使用相同的解决方案。所以人们可以在画布上画一些东西,有一个resize按钮,当你点击它时,你可以“画”一个矩形(比如带虚线边框和透明填充),然后标记该矩形中的所有内容。然后,您可以抓住其中一个角,使标记的图纸变小或变大,并同时移动该内容。

但老实说,我不知道如何开始。 有人知道如何做到这一点吗?

【问题讨论】:

  • 这可能会有所帮助。以下是关于在画布上缩放图像。但也许对你有帮助stackoverflow.com/questions/19100009/…
  • @M.sulemanKhan 这看起来确实很有趣,那么问题就在于如何标记特定区域并使用该区域而不是图像

标签: javascript jquery html canvas


【解决方案1】:

没那么难:

  1. 创建一个按钮,附加一个事件监听器,调用一个函数。为了我的指南,我将其称为resize
  2. 在画布上创建虚线边框覆盖。只需将其设为 div,将画布包装到包装器中,应用一点 CSS。瞧。
  3. 将事件处理程序附加到 div 以使其可调整大小或在 Web 上搜索可以执行此操作的库。
  4. 然后您必须使用CanvasRenderingContext2D.drawImage() 将画布重新绘制为图像。

值得注意的是,画布是光栅图形。画布会随着放大而变得不清晰。

【讨论】:

  • 我想,你错了一点。我想只标记一些图纸,比如你写了一个数学公式,你注意到你的空间不足,然后你想在画布上标记那个部分并调整它的大小并将它放在左上角以角落为例,让您再次拥有更多空间。
  • @nameless 这就是 div 的用途,不是吗?您可以有一个创建阶段,在此阶段用户调整它的大小,并在一个缩放阶段调整 div 的大小,调整画布中的基础内容的大小。
  • 不确定...用户如何在示例中标记他想要调整大小的区域?那他怎么能动呢?我在 cmets 中指出的 Stackoverflow 线程看起来很有希望,只是不确定如何将它用于选定区域而不是图片
  • @nameless 使 div 可移动。使其可调整大小。如果您不能自己编写,有很多 JavaScript 库可以帮助您。查看我链接到的drawImage 的文档。您可以向它传递参数,指定要绘制图像的区域(图像是原始画布)以及要绘制它的位置。
  • 我该如何指定 div?同样,我不想调整要选择特定部分的孔画布的大小。我该如何选择它?你能告诉我一个图书馆,以便我知道你指的是哪一个吗?
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多