当前位置: 首页 > 面试题库 >

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

牟嘉
2023-03-14
问题内容

HTML5 Canvas没有用于显式设置单个像素的方法。

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

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

context.putImageData(data, x, y)

放置到位。

谁能描述一种有效且可靠的方法?


问题答案:

有两个最佳竞争者:

  1. 创建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, x, y );


  2. 使用fillRect()绘制像素(应该没有走样的问题):

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

    ctx.fillRect( x, y, 1, 1 );

我建议针对您关心的浏览器进行测试以实现最大速度。 截至2017年7月,fillRect()在Firefox v54和Chrome
v59(Win7x64)上速度提高了5-6倍。

其他更明智的选择是:

  • 使用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()仅涂抹您想要的像素。这可能非常快,但是有一个局限性,就是您需要预先计算所需的像素。

请注意,我的测试并不尝试保存和恢复canvas上下文fillStyle;这会降低fillRect()性能。另请注意,我不是从一开始就做任何准备,也不是每次测试都测试完全相同的像素集。



 类似资料:
  • 问题内容: 我想每次引用页面时都增加一个cookie值,即使该页面是从缓存中加载的。实现此目的的“最佳”或最简洁的方法是什么? 问题答案: 从http://www.quirksmode.org/js/cookies.html#script被盗 使用它: 如评论中指出的那样,由于cookie被存储并作为字符串返回,因此您应该将其强制转换为int。使用或会为您实际投放,但更确切地知道您正在使用的是更安

  • 我想在处理草图显示上标记点,但是只显示一个像素,这在我的显示器屏幕上几乎看不到,所以我想把它稍微大一点。请问,用四个或九个像素而不是一个像素来标记一个点的最佳方式是什么?我可以使用或,但它们看起来像一个大锤和螺母解决方案。也许在这个点周围画一个3x3的正方形可能是最好的,但我想问的是,如果已经有一个众所周知的解决方案可用的话。

  • 问题内容: 您发现运行Eclipse的最佳JVM设置是什么? 问题答案: Eclipse Helios 3.6和3.6.x设置 替代文字http://www.eclipse.org/home/promotions/friends-helios/helios.png 在对Eclipse Ganymede 3.4.x和Eclipse Galileo 3.5.x进行设置之后,下面是对Eclipse He

  • 我花了一整天的时间试图点击画布返回像素xy偏移。这是一项多么艰巨的任务啊! 这就是我的结局: http://jsbin.com/xajeluxija/2/ 它在厚厚的黑色边框内产生白色画布。 在画布内单击,它将显示XY坐标。 如您所见,我故意创建了一个需要滚动的画布,并且没有向左对齐。这是为了强制执行一个健壮的解决方案。(测试用例可以改进吗?) 这几乎奏效了!但是如果你试着点击左上角,你会得到(1

  • 问题内容: 有一个简单的方法来放置一个网页上的一个三态复选框,将其绑定到一个布尔模型,以便后者可以采取,或值? 到目前为止,我找到的最接近的解决方案是http://jsfiddle.net/HB7LU/454/,但是在设置初始视图状态时存在缺陷(因为在第一次渲染期间无法获取模型值)。任何其他建议都涉及多个子复选框,并通过监视它们来解决问题。 问题答案: http://jsfiddle.net/xJ

  • 问题内容: 我有一个用Java编写的Web应用程序(Spring,Hibernate / JPA,Struts2),用户可以在其中上传图像并将其存储在文件系统中。我想缩放这些图像,以使它们具有一致的大小,以便在网站上显示。哪些库或内置函数将提供最佳结果?在做出决定时,我将考虑以下标准: 免费/开源(基本) 易于实施 结果质量 性能 可执行文件的大小 问题答案: 看一下Java Image I /