【问题标题】:html5 line blurred and not soldhtml5线条模糊不卖
【发布时间】:2012-05-25 05:27:14
【问题描述】:

我正在学习以下教程:http://www.html5canvastutorials.com/tutorials/html5-canvas-lines/

我的问题是,这条线变得模糊,不像他们网站上的那样坚固和漂亮。

代码如下:

    var canvas = document.getElementById("rightSide");
    var context = canvas.getContext("2d");

    context.beginPath();
    context.moveTo(50, 100);
    context.lineTo(200, 100);
    context.stroke();


#leftSide {
    width:200px;
    padding:15px;
    background:#eee;
    border:1px solid #aaa;
    float: left;
}

#rightSide {
    width:1000px;
    height: 700px;
    padding:15px;
    background:#eee;
    border:1px solid #aaa;
    float: left;
    margin:0px 0px 0px 20px;
}

<div id="leftSide">
    <a class="trigger" href="#">Areas</a>
    <ul class="level1">
                <li><a href="http://www.google.com">Area 1</a></li>
                <li><a href="#">Area 2</a></li>
                <li><a href="#">Area 3</a></li>
                <li><a href="#">Area 4</a></li>
                <li><a href="#">Area 5</a></li>
                <li><a href="#">Area 6</a></li> 
    </ul>

</div>

<canvas id="rightSide"></canvas>

谢谢

编辑: 我实际上发现了一些非常有趣的东西,但我仍然不明白它有什么不同。 当我将画布大小坐标从 CSS 移动到标签时,该行显示正常。

canvas id="rightSide" width="800px" height="600px">

非常想解释一下这里发生了什么。 谢谢。

【问题讨论】:

    标签: html5-canvas


    【解决方案1】:

    为了建立在 Parth 的答案(在 cmets 中正确识别)的基础上,画布的实际大小是在属性上定义的,而不是 CSS。

    例如,如果您有以下代码,绘图区域将是 100x100 而不是 200x200。模糊效果与使用相同 CSS 的 100x100 图像相同。

    <style>
        canvas {width: 200px; height: 200px}
    </style>
    <canvas width="100" height="100"></canvas>
    

    这实际上对 iPhone 4 或 iPad 3 等设备产生了有趣的影响,每个设备像素都有四个物理像素。在这种情况下,适当大小的画布(100x100 的 100x100 会模糊)。在这种情况下,您实际上需要将画布翻倍以获得清晰的图像:

    <style>
        canvas {width: 200px; height: 200px}
    </style>
    <canvas id="retina" width="400" height="400"></canvas>
    

    【讨论】:

      【解决方案2】:

      浏览器通常对绘制的线进行抗锯齿处理(实际上任何使用上下文函数的东西,如 lineTo、arcTo、quadraticCurveTo)。

      所以,如果你给了起点(50,50)和终点(300,50),它会反锯齿,所以绘制的线会显示模糊,因为它会在49.5中绘制模糊的线颜色-50 && 55-55.5(如果线宽为 5)。

      因此,有时解决方案是以浮点形式给出坐标。浏览器接受浮点坐标并不会忽略它,它会在其画线算法中使用浮点数(可能是dda,我不太清楚)。

      这里是示例 :: http://jsfiddle.net/parth1403/xt7dN/2/

      【讨论】:

      • 好的,它似乎让事情变得更好了,但它并没有真正解释为什么在教程网站上使用相同的代码(不使用浮点),它显示为实心。
      • 在教程站点中,线条是倾斜的,而您的代码中的线条是直的,这就是抗锯齿清晰显示的原因。在您的代码中使用相同的坐标,结果可能相同。
      • 好的。当您在 css 中传递画布的宽度和高度时,画布会被缩放,这就是线条模糊的原因。但是,如果您将画布的宽度和高度作为画布元素的属性传递,则将创建画布而不使用宽度 * 高度的位图。
      • 显然是这样,我没有看到任何其他解释。更改您的答案或创建一个新答案,我会批准它。
      猜你喜欢
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2013-01-22
      相关资源
      最近更新 更多