当前位置: 首页 > 文档资料 > HTML5 Canvas 实战 >

3.6 处理像素:图像反色

优质
小牛编辑
143浏览
2023-12-01

现在,我们知道如何访问图像数据,包括图像或视频的每一个像素的RGBA,下一步我们探索一下处理像素的可能性。本节,通过反转每个像素的颜色,来实现图像的反色处理。

图像反色
图3-7 图像反色

警告:由于getImageData()方法的安全限制,本节的例子必须在Web服务器上运行。

绘制步骤

按照以下步骤,实现图像的反色处理:

1. 定义画布上下文:

window.onload = function(){
  var canvas  = document.getElementById("myCanvas");
  var context = canvas.getContext("2d");

2. 创建一个image对象,并把onload属性设置为一个绘制图像和获取图像数据的函数:

  var imageObj  = new Image();
  imageObj.onload  = function(){
    var sourceWidth  = this.width;
    var sourceHeight = this.height;
    var sourceX  = canvas.width  /  2  - sourceWidth  /  2;
    var sourceY  = canvas.height  /  2  - sourceHeight  /  2;
    var destX  = sourceX;
    var destY  = sourceY;
    context.drawImage(this, destX, destY);
    var imageData  = context.getImageData(sourceX, sourceY, sourceWidth, sourceHeight);
    var data  = imageData.data;

3. 循环处理图像的所有像素,并反转其颜色:

  for  (var i  =  0; i  < data.length; i  +=  4)  {
       data[i]  =  255  - data[i];              // red 红
       data[i  +  1]  =  255  - data[i  +  1];  // green 绿
       data[i  +  2]  =  255  - data[i  +  2];  // blue蓝
       // i+3 is alpha  (the fourth element) i+3是透明度(第四个元素)
   }

4. 使用处理后的图像覆盖源图像,然后在onload 定义的外面,设置图像的源地址:

    //使用新图像的数据覆盖源图像
    context.putImageData(imageData, destX, destY);
  };
  imageObj.src  = "jet_300x214.jpg";
};

5. 在HTML文档的body部分嵌入canvas标签:

<canvas id="myCanvas" width="600" height="250" style="border:1px solid black;">
</canvas>

工作原理

要使用HTML5的画布对图像进行反色处理,可以简单地循环处理图像的所有像素,再使用颜色反转算法反转每一个像素的颜色。不必担心,这比听起来简单多了。要反转一个像素的颜色,只需用255减去该像素的每一个RGB分量即可,代码如下:

data[i] = 255 - data[i]; // red

data[i+1] = 255 - data[i+1]; // green

data[i+2] = 255 - data[i+2]; // blue

像素被更新完成后,我们可以调用画布上下文对象的putImageData()方法来重绘图像:

context.putImageData(imageData, destX, destY);

从根本上说,该方法允许我们使用图像数据,而不是使用drawImage()方法的源图像来绘制图像。