【问题标题】:Canvas drawing gets distorted when resizing canvas调整画布大小时,画布绘图会变形
【发布时间】:2015-03-09 20:08:19
【问题描述】:

我正在使用 html5 和 javascript 在画布上进行绘图。

如果我不手动设置画布宽度和高度(保持默认),我的绘图效果很好。

但是,当我从 css 或 javascript 设置画布大小时,我的绘图看起来像扭曲了。线条开始稍微偏离线条,线条看起来扭曲了。

这是mousedown事件的代码。

if (mouseDown)
    {
        previousX = currentX;
        previousY = currentY;
        currentX = e.clientX - canvas.offsetLeft;
        currentY = e.clientY - canvas.offsetTop;
        ctx.beginPath();
        ctx.moveTo(previousX, previousY);
        ctx.lineTo(currentX, currentY);
        ctx.strokeStyle = color;
        ctx.lineWidth = y;
        ctx.stroke();
        ctx.closePath();
    }

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    您必须使用正确的属性/属性设置画布的大小。

    Canvas 是一个带有位图的元素。如果您使用 CSS 或样式,您只会缩放元素,而不是位图。结果是一个模糊的图像。

    通过这样做设置正确的大小(通常不需要 CSS):

    <canvas width=800 height=800></canvas>
    

    或在 JavaScript 中:

    canvas.width = 800;    // example size
    canvas.height = 800;
    

    如果您使用 CSS(使用规则或元素中的样式属性)来缩放画布,您只会将 300x150 像素的位图缩放到其他会导致质量差的东西。始终缩放位图,然后重绘(因为画布将被清除)。

    【讨论】:

    • 这行得通,谢谢!而且,使用这个,如果我在画布上向下滚动(当画布不适合屏幕时),鼠标在绘图时会离开线..
    • 你为什么不打开一个新问题?
    【解决方案2】:

    canvas API 仅用于在光栅中绘制。这就是为什么它在调整大小时不保持清晰度。这是意料之中的事。

    如果您想制作矢量,则必须改用 SVG(可缩放矢量图形)。但是 SVG 不支持绘图。生成 SVG 基本上是通过 XML,所以不像 canvas API 那样灵活。

    这里有一个库,可以帮助您完成在矢量画布上的绘制:

    http://paperjs.org/

    “Paper.js 是一个在 HTML5 Canvas 之上运行的开源矢量图形脚本框架。”

    这是另一个列举更多选项的线程:

    HTML5 Canvas Vector Graphics?

    【讨论】:

    • 嗯,是的,但是在 html5 中只能在默认大小的画布上绘制,而不能选择自己的,这不是很奇怪...
    • @NejcLovrencic 检查帖子。我添加了一个库,可以帮助您在矢量中写入画布。如果对您有帮助,请点赞并标记正确。
    • @NejcLovrencic 我不确定你的意思。您可以将画布大小设置为任意大小。
    • @shmuli 这仅在您必须使用相同的位图进行缩放时才正确。如果你可以重绘,就像画布一样,没有区别。 SVG 也需要光栅化才能显示在屏幕上。 Canvas 也使用路径,就像 SVG 一样,除了绘制图像或视频(同样的限制适用于嵌入位图/图像的 SVG)。除此之外,问题在于开发人员如何处理,而不是画布。我的 2 美分..
    • @shmuli 你必须在画布改变大小时重新绘制画布,因为它会被清除。 OP 没有在这里显示他的设置代码,但他可能正在使用 CSS 将默认的 300x150 缩放到某个值,这意味着画布的位图被缩放。他需要使用宽度/高度属性,然后重绘(点可以存储在数组等中)。
    猜你喜欢
    • 2012-06-26
    • 2020-12-23
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多