【问题标题】:HTML 5 canvas tag, change specific pixelsHTML 5 画布标签,更改特定像素
【发布时间】:2014-02-17 23:13:36
【问题描述】:

使用画布标签,我如何在不使用ctx.lineToctx.fillRect 之类的东西的情况下更改特定位置的特定像素的颜色?

例子:

我的画布标签是 500 x 600 像素,如何将 x 轴位置 100 和 y 轴位置 200 处的像素变为蓝色?

【问题讨论】:

标签: html5-canvas


【解决方案1】:

这是一个获取/替换指定像素颜色的函数:

// test
setPixel(100,200,0,0,255);

function setPixel(x, y, red, green, blue) {
    var pxData = ctx.getImageData(x,y,1,1);
    pxData.data[0]=red;
    pxData.data[1]=green;
    pxData.data[2]=blue;
    pxData.data[3]=255;
    ctx.putImageData(pxData,x,y);
}

如果您要处理许多像素,则可以将 getImageData 拉到 setPixel 外部的变量中以获得更好的性能:

var pxData = ctx.getImageData(x,y,1,1);

// test
for(var x=100;x<125;x++){
    setPixel(x,200,0,0,255);
}

function setPixel(x, y, red, green, blue) {
    pxData.data[0]=red;
    pxData.data[1]=green;
    pxData.data[2]=blue;
    pxData.data[3]=255;
    ctx.putImageData(pxData,x,y);
}

【讨论】:

  • 在第二个示例中,我会将ctx.putImageData 移出循环。
  • 另外值得一提的是:虽然大多数画布操作通常是硬件加速的,但您在 getImageDataputImageData 之间所做的任何事情都不是,这使得直接像素操作的性能与大多数其他操作。当您需要大量实时像素级操作时,您可以研究 WebGL 并使用在 GPU 上执行的像素着色器。
  • @Philipp,如果您将 ctx.putImageData 排除在循环之外,循环测试示例就会中断,因为 pxData 只是 1x1。 ;)
  • 啊,我知道你在那里做了什么。但在这种情况下,您应该使用context.createImageData
  • 我更喜欢第一个解决方案中的 getImageData 。这样,如果我看到像素已经是蓝色的,我就不需要执行 putImageData。在循环中,两者都可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2015-06-17
相关资源
最近更新 更多