`
love19820823
  • 浏览: 974171 次
文章分类
社区版块
存档分类
最新评论

HTML5 Canvas disable anti-aliasing drawing - HTML5 Canvas 如何取消反锯齿绘图

 
阅读更多

HTML5 Canvas 如何取消反锯齿绘图

(HTML5 Canvas how to turn off anti-aliasing drawing)

一、问题的提出

我们都知道反锯齿(anti-aliasing)绘图给我们带来更好的视觉体验,有了这个技术,绘制的图形的边缘再不是以前毛毛躁躁的样子了。这就是采用反锯齿算法的功劳。其实质就是把要绘制的颜色边缘和背景颜色做适当的融合,在人的眼睛看来,有种像雾像雨又像风的感觉。HTML5 Canvas的绘图就是默认anti-aliasing的。其实作为一般的开发者,可以不关心这个东西的存在,好像anti-aliasing是理应如此的。但是,如果我们的用户非要看到non-anti-aliasing的效果呢?

这个类似有了酱油还要吃盐的问题。酱油是好,但是有人就是要吃盐,怎么办?

另外的需求是,即时有了酱油,我还是需要吃盐。为啥,酱油有它的好处,盐有盐的用处。

比如:当我们在Canvas上移动鼠标的时候,我需要知道我的鼠标位置在什么图形上,即著名的点选问题。Canvas以前的绘图软件解决这个问题有标准的方法,就是用图形的ID作为图形的颜色值,绘制在内存当中的后台画布上,当我们移动鼠标在前台显示的画布上,我们可以通过获取后台画布的该点的像素值(ID)来获得图形ID。

这样一切都近乎完美。后台画布与前台画布采用完全一样的绘图机制,不同点是前台画布采用用户看到的实际像素颜色值,而后台画布采用图形的ID作为图形绘制的像素颜色值。这里的前提是,我们能控制这些像素值,以确保它在被绘制到后台画布的时候不被改变,就是我让你画一个像素颜色=1,你别自作聪明搞出个=1.5。遗憾的是目前版本的HTML5 Canvas就是这种自作聪明的家伙。迄今为止,我们没办法控制去掉anti-aliasing这个自作聪明的算法。我试过即使把context.mozImageSmoothingEnabled=false也不行。

如果这儿谁有一句话的方法可以满足我上面讲的需求,那么这篇文章直接就等于是狗屎。我费了很多的努力研究出了这篇狗屎文,在这里以飨读者,包括我自己。

二、解决方法探讨

如何取消(废止)HTML5 Canvas的反锯齿功能,在http://stackoverflow.com上也有很多讨论。如果让HTML5实现者来解决这个问题,几乎就是一句话搞定的事情。然而需要我们一周的时间想各种点子。在HTML5 Canvas本身没解决这个问题之前,如果让有的人来解决,几乎要花掉几个月的时间,好在如果你看到这篇文章,你就可以告诉你的老板,你只需要几个晚上就可以解决了。下面我教你具体办法。

前台画布我不管它,你怎么画是你自己的问题,后台画布和前台一样大小,涂满黑色(#000000)。然后你在前台Canvas上画图形id=1的时候,同时在后台画布上用1为颜色画这个同样的图形。对了,我还没告诉你如何去掉anti-aliasing,如果不去掉anti-aliasing,系统可能给画出来的像素颜色是1.5,这显然不是你想要的,也不是我写这篇狗屎文的目的。

我只好用代码来说明问题。记住这是HTML5的代码,javascript而已。

在HTML5页面中有Canvas:

<canvas id="_canvasView" width="500" height="400">
This browser does not support HTML5 Canvas.
</canvas>

创建前台画布:

var canvas = document.getElementById("_canvasView");

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

创建后台画布:

var backend = document.createElement("canvas");
backend.width = canvas.width;
backend.height = canvas.height;
var backendContext = backend.getContext("2d");

// 后台画布涂上黑色(我相信anti-aliasing不会把它搞成灰色)

backendContext.fillStyle = "#000000";
backendContext.fillRect(0, 0, backend.width, backend.height);

// 获取后台画布对应的像素数组

var imageObj = backendContext.getImageData( 0, 0, canvas.width, canvas.height);
var imageData =
imageObj.data;

如果你想给这个数组里的像素赋予颜色值,可以像下面的代码:

function setPixel(imageData, width, height, x, y, red, green, blue)
{

// i 没做边界条件检查,留给读者自己完成。

var i = (y*width+x)*4;
imageData[i] = red;
imageData[i+1] = green;
imageData[i+2] = blue;

// 下面这个是Alpha,我们不用

//DEL: imageData[i+3]=???;

}

HTML5声称imageData是可以直接操控的。因此,这是我们良好的机会去直接设置像素值。把一个像素数组设置回绘图上下文和我写累了上厕所拉泡屎一样简单:

backendContext.putImageData(imageData, 0, 0);

接下来是发挥你大学学习计算机图形学的智慧的时候了。

三、真的需要微积分么?

微积分大家原理都知道,真正用的时候就发抖了。毕竟我们是写网页脚本的,研究基础代数可不是强项啊。微积分肯定是不需要的,因此计算机图形学也是不需要的。然而,的确有一种解决的办法,就是利用计算机图形学的知识。很底层啊,读者要有心理准备,别雷倒了。



有个叫Bresenham的家伙,我们都要感谢他告诉我们怎么把一条线画到屏幕上。就是知道2个点坐标,从而知道如何点亮这条线经过的像素点的问题。我上面贴出来的代码不是卖弄我的图形学理论知识,实话说,代码是google出来的,我只是去伪存真而已。但是按上面的方法的确可以实现我要的去掉反走样,看看我工作的截图:


上面这个图就是带有反走样的前台画布的现实效果。而下面的这个就是后台画布去掉反走样的现实效果。我就是采用上面的Bresenham算法来实现的,运行效率还蛮高的。

其实用这种办法,新带来的问题比原来的更多更复杂:

1)都HTML5时代了,还要Bresenham这个老家伙出来壮场子,当我白痴啊。

2)写脚本的一般都是算法小白,这样会吓傻人的。

3)HTML5 Canvas如果真是这样用,岂不是更大的退步吗?

4)最大的困难是那么多图形类型,每个都要用Bresenham算法搞定,不是太了么?

四、你可能需要第三块画布

早上风大,吹的头现在疼的很,我都不想继续写了。还是咬牙一下,谁让我是专家呢。

第三块画布是个即擦即用的画布,有了它,Bresenham算法就滚蛋了。过程如下:

1)前台画布每画一个图形G,就在第三块画布上画同样的图形G,前提是第三块画布上每次画图形之前都清空(涂黑)。这就是即擦即用的意思。不要以为我打错字了(不是插),我没那么傻B。

2)然后取得第三块画布的图像像素数组,遍历图形G所在范围矩形内的全部像素p(i,j),如果像素值v=p(i,j)=0为黑,就忽略,否则就到后台画布相应的位置p(i,j)上用G的ID作为颜色填上p(i,j)=ID。

最后我们得到的后台画布一定是没有反锯齿的家伙。好了,anti-aliasing,滚你马蛋吧。

因为头疼,不能写代码了。这个原理也解释的很清楚了。相信读者有能力自己完成了。

此致敬礼!

cheungmine 2011-12-8


分享到:
评论

相关推荐

    HTML5Canvas如何取消反锯齿绘图

    HTML5Canvas的绘图就是默认anti-aliasing的。其实作为一般的开发者,可以不关心这个东西的存在,好像anti-aliasing是理应如此的。但是,如果我们的用户非要看到non-anti-aliasing的效果呢?这个类似有了酱油还要吃盐...

    html2canvas@1.0.0-rc.4.rar

    《html2canvas@1.0.0-rc.4:网页截屏库的详细解析》 html2canvas是一个JavaScript库,它的主要功能是允许在浏览器环境中将HTML元素转化为Canvas图像,进而可以进行保存或者进一步的图像处理。这个库在前端开发中...

    html2canvas-1.0.0-rc.4版本

    html2canvas-1.0.0-rc.4版本

    Leaflet.Canvas-Markers-0.2.0

    2. **自定义样式**:用户可以通过Canvas API提供的强大绘图能力,为每个标记定制独特的外观。这意味着你可以创建出形状、颜色、阴影等多样的标记效果,从而实现高度的个性化和视觉吸引力。 3. **交互性**:Canvas...

    文字粒子效果html5-canvas-side-文字.rar

    HTML5的Canvas元素是网页开发中的一个重要组成部分,它允许开发者在网页上进行动态图形绘制,提供了丰富的绘图功能。在这个“文字粒子效果html5-canvas-side-文字.rar”压缩包中,包含的项目是一个利用Canvas API...

    开源的HTML5 Canvas画图插件 - Literally Canvas

    HTML5的Canvas元素为网页带来了强大的图形绘制能力,而Literally Canvas则是一个优秀的基于Canvas的开源画图插件,它提供了一套完整的画图工具,使得用户可以在网页上进行自由的绘图操作。在本文中,我们将深入探讨...

    canvas.c - A drawing canvas widget

    5. **标签绑定**:`canvas`上的图形对象可以与数据结构关联,这种绑定使得数据可视化变得简单。例如,每个图形可以代表数据库中的一个记录。 6. **图像支持**:除了基本图形外,`canvas`还可以显示位图或PNG等图像...

    html2canvas 1.0.0-rc.5

    低版本HTML2canvas 前端开发 生成海报 截图等功能 1.该脚本允许您直接在用户浏览器上对网页或其部分进行“截图”。屏幕截图基于 DOM,因此可能不是 100% 准确到真实表示,因为它不会制作实际的屏幕截图,而是根据...

    html2canvas-rc4.js和html2canvas.min.js

    HTML2canvas是一个JavaScript库,它的主要功能是将HTML页面或者DOM元素转换为Canvas图像或图片。这个库在前端开发中非常有用,特别是在需要保存网页截图或者实现动态生成图像的场景中。然而,像所有软件一样,...

    html5-canvas-mouse-ink

    总的来说,"html5-canvas-mouse-ink"项目涵盖了HTML5 Canvas的基本绘图方法、事件监听、动画框架以及可能的高级技巧。通过学习和实践这个项目,开发者可以深入了解Canvas的潜力,并提升在Web前端开发中的动态图形...

    canvas-basic-graphics.zip

    `&lt;canvas&gt;`标签是HTML5新增的一个元素,用于在网页上创建可编程的2D绘图区域。通过JavaScript,我们可以获取到这个元素的`2D渲染上下文`(`2D Rendering Context`),它提供了一系列的方法和属性,用于绘制和操作...

    html5-canvas-3d-earth-rotate.zip

    总之,"html5-canvas-3d-earth-rotate.zip"项目展示了HTML5 Canvas在3D图形方面的应用,通过JavaScript实现了3D地球的动态旋转效果,这不仅涉及到基本的Canvas绘图,还包括3D图形理论和动画技术。对于想要提升Web...

    html5-canvas-3d-line-avatar.zip

    HTML5 Canvas是一个强大的Web图形接口,它允许开发者在网页上直接绘制2D和3D图形。这个"html5-canvas-3d-line-avatar.zip"压缩包显然包含了一个使用HTML5 Canvas实现3D线框头像的示例项目。在这个项目中,我们将探讨...

    html5-canvas-web-图片涂鸦

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。"html5-canvas-web-图片涂鸦"这个主题涉及到的知识点主要集中在如何利用HTML5的Canvas API来实现图片...

    HTML5 Canvas核心技术-图形、动画与游戏开发

    HTML5 Canvas核心技术-图形、动画与游戏开发,在网页游戏中的开发技术,适合初学者入门

    HTML5 Canvas.mobi - kindle

    HTML5 Canvas.mobi - kindle

    html5-canvas-rabbit-run-games-code

    HTML5 Canvas 是一种在网页上绘制图形的API,它是HTML5标准的一部分,允许开发者通过JavaScript进行动态、交互式的2D和3D图形渲染。在这个"html5-canvas-rabbit-run-games-code"项目中,我们关注的是一个基于Canvas...

    Python库 | streamlit_drawable_canvas-0.5.1-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:streamlit_drawable_canvas-0.5.1-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    html5-canvas-border-pixel-progressbar

    HTML5 Canvas Border Pixel Progressbar是一种使用HTML5 Canvas API创建的进度条效果,它将边界像素化,以展示进度。在本文中,我们将深入探讨HTML5 Canvas API,了解如何利用其特性构建这种独特的进度条。 首先,...

Global site tag (gtag.js) - Google Analytics