在HTML5画布中设置单个像素的最佳方法是什么?

前端之家收集整理的这篇文章主要介绍了在HTML5画布中设置单个像素的最佳方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
HTML5 Canvas没有显式设置单个像素的方法

可能使用非常短的线来设置像素,但是抗锯齿和线帽可能会干扰。

另一种方法是创建一个小的ImageData对象,并使用:

context.putImageData(data,x,y)

把它放到位。

任何人都可以描述一个有效和可靠的方法这样做吗?

解决方法

有两个最好的竞争者:

>创建1×1图像数据,设置颜色,并将putImageData放置在以下位置:

var id = myContext.createImageData(1,1); // only do this once per page
var d  = id.data;                        // only do this once per page
d[0]   = r;
d[1]   = g;
d[2]   = b;
d[3]   = a;
myContext.putImageData( id,y );

>使用fillRect()来绘制像素(应该没有别名问题):

ctx.fillStyle = "rgba("+r+","+g+","+b+","+(a/255)+")";
ctx.fillRect( x,y,1,1 );

你可以在这里测试这些速度:http://jsperf.com/setting-canvas-pixel
在Chrome上,1×1图片数据大约是使用fillRect的10倍(!)。
在Firefox 3.6上,1×1的速度只有1.3倍。
在Firefox 4.0b上,1×1大约是80x(!!)比fillRect慢。
此减速仅在启用硬件加速和may be fixed时发生。

我建议使用1×1图像数据获得最大速度。

其他,sillier替代品是:

>在整个画布上使用getImageData()/ putImageData()如测试中所示,这是比其他选项慢约100倍。
>使用数据网址创建自定义图像,并使用drawImage()显示它:

var img = new Image;
img.src = "data:image/png;base64," + myPNGEncoder(r,g,b,a);
// Writing the PNGEncoder is left as an exercise for the reader

>创建另一个img或画布填充所有你想要的像素,并使用drawImage()blit只是你想要的像素。这可能会非常快,但有一个局限,你需要预先计算所需的像素。

注意,我的测试不会尝试保存和恢复canvas上下文fillStyle;这将进一步减慢fillRect性能。还要注意(由于测试框架的限制)我不是从一个干净的板岩开始,或测试每个测试完全相同的像素集。

原文链接:https://www.f2er.com/html5/170316.html

猜你在找的HTML5相关文章