在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] 删除。
我来说两句