HTML5canvas和反锯齿
如何打开canvas上的反锯齿 。
下面的代码不会画出一条平滑的线条:
var context = mainCanv.getContext("2d"); if (context) { context.moveTo(0,0); context.lineTo(100,75); context.strokeStyle = "#df4b26"; context.lineWidth = 3; context.stroke(); }
消除锯齿function无法打开或closures,并由浏览器控制。
我可以closuresHTML <canvas>元素的抗锯齿function吗?
您可以将canvas翻译半个像素的距离。
ctx.translate(0.5, 0.5);
最初是物理像素之间的canvas定位点。
我不需要打开反别名,因为它默认情况下,但我需要closures它。 如果可以closures,也可以打开。
ctx.imageSmoothingEnabled = true;
当我在我的canvasRPG上工作时,我通常会closures它,所以当我放大图像时不要模糊。
这是一个解决方法,要求您逐个像素地绘制线条,但是会防止消除锯齿。
// some helper functions // finds the distance between points function DBP(x1,y1,x2,y2) { return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); } // finds the angle of (x,y) on a plane from the origin function getAngle(x,y) { return Math.atan(y/(x==0?0.01:x))+(x<0?Math.PI:0); } // the function function drawLineNoAliasing(ctx, sx, sy, tx, ty) { var dist = DBP(sx,sy,tx,ty); // length of line var ang = getAngle(tx-sx,ty-sy); // angle of line for(var i=0;i<dist;i++) { // for each point along the line ctx.fillRect(Math.round(sx + Math.cos(ang)*i), // round for perfect pixels Math.round(sy + Math.sin(ang)*i), // thus no aliasing 1,1); // fill in one pixel, 1x1 } }
基本上,你可以find线的长度,并逐步遍历该线,四舍五入每个位置,并填充一个像素。
用它来呼叫
var context = cv.getContext("2d"); drawLineNoAliasing(context, 20,30,20,50); // line from (20,30) to (20,50)
如果你需要在canvas上进行像素级控制,你可以使用createImageData和putImageData 。
HTML:
<canvas id="qrCode" width="200", height="200"> QR Code </canvas>
和JavaScript:
function setPixel(imageData, pixelData) { var index = (pixelData.x + pixelData.y * imageData.width) * 4; imageData.data[index+0] = pixelData.r; imageData.data[index+1] = pixelData.g; imageData.data[index+2] = pixelData.b; imageData.data[index+3] = pixelData.a; } element = document.getElementById("qrCode"); c = element.getContext("2d"); pixcelSize = 4; width = element.width; height = element.height; imageData = c.createImageData(width, height); for (i = 0; i < 1000; i++) { x = Math.random() * width / pixcelSize | 0; // |0 to Int32 y = Math.random() * height / pixcelSize| 0; for(j=0;j < pixcelSize; j++){ for(k=0;k < pixcelSize; k++){ setPixel( imageData, { x: x * pixcelSize + j, y: y * pixcelSize + k, r: 0 | 0, g: 0 | 0, b: 0 * 256 | 0, a: 255 // 255 opaque }); } } } c.putImageData(imageData, 0, 0);
在这里工作示例
您可以通过对canvas对象应用CSS转换来实现消除锯齿效果:
<style> canvas { transform: scale(0.5); } </style>
但是,这可能会干扰连接到canvas上的任何与鼠标位置相关的事件。