如何操纵画布中的像素?

问题描述:

让我解释一下我想达到什么..如何操纵画布中的像素?

我建立的东西只是为了好玩,并作为学习实验类似

www.milliondollarhomepage.com

除此之外,我想用画布和/或Fabric.js来实现相同的目的。我将如何去操纵画布中的每个像素?

场景:

  • 我想提供一个1000个像素的争夺。
  • 用户可以选择一幅图像,并将其放在画布上
  • 图像可根据用户想要的像素大小以及从整体剩余像素中扣除的像素大小进行调整。

任何帮助,将不胜感激!

+0

这看起来类似于fabricjs演示http://fabricjs.com/per-pixel-drag-drop/,你可以调整画布上的单个像素,但它是更多的工作。 – QuentinUK 2013-03-08 19:29:35

用于操纵各个像素在HTML5画布API的方法是

context.getImageData(x,y,width,height); 

例如

var map = context.getImageData(0,0,canvas.width,canvas.height); 

这将返回一个包含重复顺序大规模阵列:

[red,green,blue,alpha,red,green,blue,alpha...] 

每个4数字代表红色,绿色,蓝色和alpha通道f或选定区域上的每个像素,从左到右,从上到下。

这些数字中的每一个的值都是从0 - 255开始的整数。

要遍历每个像素,并放弃他们redblue渠道,从而把图像绿,例如

//assume map variable from earlier 

for(var i = 0; i < map.data.length; i+=4){ 
    map.data[i] = 0; // drop red to 0 
    map.data[i+2] = 0; // drop blue to 0 
} 
context.putImageData(map,0,0); 

See Example

注意,这个过程只能在服务器上完成,没有来自其他领域的图像“污染”画布。如果这些要求不符合,则会抛出安全错误DOM异常。

+0

关于'map'数组中每个像素通道顺序的说明:这个顺序就是所谓的[Big Endian](http://en.wikipedia.org/wiki/Big_endian)。然而,计算中的大多数结构(例如http数据包,大多数低级图形API)都使用Little Endian。一个例子是在C程序中与Linux Framebuffer接口。当映射时(假设为32位颜色),每个通道的顺序类似于:b,g,r,a,b,g,r,a,b,g,r,a,...。因此,要访问给定的红色通道,它将是'*(map + location + 2)'(或'map [location + 2]'),其中位置代表像素的索引。 – 2014-03-06 04:21:21