在HTML5画布上绘制1像素线的完整解决方案

安迪

在HTML5画布上绘制1像素线总是有问题的。(请参阅http://jsbin.com/voqubexu/1/edit?js,output

绘制垂直/水平线的方法是x + 0.5,y + 0.5(请参见0 <lineWidth <1时的Canvas线行为)。在全球范围内做到这一点,ctx.translate(0.5, 0.5);将是一个好主意。

但是,对于对角线,此方法无效。它总是给出2像素的线。有没有办法停止这种浏览器行为?如果不是,是否有可以解决此问题的软件包?

您引用的“宽”行是由浏览器自动完成的抗锯齿结果。

抗锯齿用于显示视觉上较少的锯齿线。

缺少逐像素绘制的功能,目前无法禁用浏览器绘制的抗锯齿功能。

您可以使用Bresenham的线条算法通过设置单个像素来绘制线条。当然,设置单个像素会导致性能下降。

这是示例代码和演示:http : //jsfiddle.net/m1erickson/3j7hpng0/

在此处输入图片说明

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>
<script>
$(function(){

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

    var imgData=ctx.getImageData(0,0,canvas.width,canvas.height);
    var data=imgData.data;

    bline(50,50,250,250);
    ctx.putImageData(imgData,0,0);

    function setPixel(x,y){
        var n=(y*canvas.width+x)*4;
        data[n]=255;
        data[n+1]=0;
        data[n+2]=0;
        data[n+3]=255;
    }

    // Refer to: http://rosettacode.org/wiki/Bitmap/Bresenham's_line_algorithm#JavaScript
    function bline(x0, y0, x1, y1) {
      var dx = Math.abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
      var dy = Math.abs(y1 - y0), sy = y0 < y1 ? 1 : -1; 
      var err = (dx>dy ? dx : -dy)/2;        
      while (true) {
        setPixel(x0,y0);
        if (x0 === x1 && y0 === y1) break;
        var e2 = err;
        if (e2 > -dx) { err -= dy; x0 += sx; }
        if (e2 < dy) { err += dx; y0 += sy; }
      }
    }

}); // end $(function(){});
</script>
</head>
<body>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

HTML5画布的线宽小于1像素

来自分类Dev

RXJS在HTML5画布上绘制线条

来自分类Dev

无法在html5画布上绘制

来自分类Dev

HTML5画布绘制重绘线连接未舍入

来自分类Dev

HTML5画布像素处理

来自分类Dev

为什么缩放后的HTML5画布上的“像素”奇怪地对齐?

来自分类Dev

在HTML5画布内隐藏灰线

来自分类Dev

HTML5画布—线太粗

来自分类Dev

在背景缩放上绘制HTML5画布

来自分类Dev

实时HTML5画布绘制

来自分类Dev

使用for循环绘制HTML5画布圆

来自分类Dev

html5画布绘制多个图像

来自分类Dev

HTML5画布图案绘制延迟

来自分类Dev

在背景缩放上绘制HTML5画布

来自分类Dev

连续绘制HTML5画布

来自分类Dev

HTML5画布-绘制环形扇形

来自分类Dev

html5画布部分绘制

来自分类Dev

在HTML5画布上绘制多个圆的问题

来自分类Dev

在html5画布上绘制多个粒子元素而无需渲染终止

来自分类Dev

在HTML5画布上绘制多个图像有时不起作用

来自分类Dev

如何获取在HTML5画布上绘制的图像的X / Y值?

来自分类Dev

使用JavaScript在HTML5画布上绘制大量点

来自分类Dev

让用户输入图片网址并将其绘制在html5画布上

来自分类Dev

重新加载页面后才能绘制HTML5画布(仅在Google Chrome上)

来自分类Dev

无法在Phonegap中的HTML5画布上绘制图像

来自分类Dev

在HTML5画布上绘制图像

来自分类Dev

在html5画布上绘制多个粒子元素而无需渲染终止

来自分类Dev

如何在HTML5画布上绘制背景图像

来自分类Dev

在HTML5画布上绘制/移动/删除笔划