兔子的像素操作

631 阅读2分钟

我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛

前言

此次大赛为大家准备一个可以改变兔子的像素的作品.

知识准备

canvas像素操作

在 canvas 中可以使用 context.drawImage(image,dx,dy) 方法将图片绘制在 canvas 上。将图片绘制上去后,还可以使用 context.getImageData(sx, sy, sw, sh) 方法获取 canvas 区域隐含的像素数据,该方法返回一个 ImageData 对象,里面包含的是 canvas 像素信息。

getImageData函数参数

这个函数有四个参数,都是必选的。 格式:context.getImageData(sx, sy, sw, sh)。 其中:

  • sx:将要被提取的图像数据矩形区域的左上角 x 坐标;
  • sy:将要被提取的图像数据矩形区域的左上角 y 坐标;
  • sw:将要被提取的图像数据矩形区域的宽度;
  • sy:将要被提取的图像数据矩形区域的高度;

ImageData对象

  • width:canvas的宽度
  • heigth:canvas的高度
  • data:指定区域的像素数据

image.data中的像素数据是一个一维正整数数组,一个像素信息包含 RGB 三原色信息和透明度。data 数组数据每四个为一组,分别表示 RGB 通道和透明度。这四种值取值都在 0-255 之间。

putImageData() 方法

该方法可以将 imageData 对象绘制到 canvas 上。我们可以用 getImageData 将获取到的 imageData 数据处理后再使用 putImageData 方法重新绘制到 canvas 中。 该方法的参数:ctx.putImageData(imagedata, dx, dy);

  • dx:源图像数据在目标画布中的 x 轴方向的偏移量
  • dy:源图像数据在目标画布中的 y 轴方向的偏移量;

创造

灰色处理

function handle1(imageData) {
  var data = imageData.data;
  var len = data.length;

  for (let i = 0; i < len; i += 4) {
    var avg = 0;
    for (let j = 0; j < 3; j++) {
      // RGB 颜色值求平均
      avg += (data[i + j] / 3);
    }
    // 把平均值付给 RGB
    data[i] = data[i + 1] = data[i + 2] = avg;
  }
  return imageData;
}

红色处理

  var data = imageData.data;
  var len = data.length;
  for (let i = 0; i < len; i += 4) {
    let sum = 0;
    for (let j = 0; j < 3; j++) {
      sum += data[i + j];
    }
    var avg = sum / 3;
    data[i] = avg; // 红色是平均值
    // 绿色和蓝色都设为零
    data[i + 1] = data[i + 2] = 0;
  }
  return imageData;
}

黑白处理

function handle3(imageData) { var data = imageData.data; var len = data.length;

for(let i = 0;i < len;i += 4){
    var avg = 0;
    for(let j = 0;j < 3;j ++){
        avg += (data[i + j] / 3);
    }
    //!判断
    data[i] = data[i + 1] = data[i + 2] = avg < 128 ? 0 : 255;
}
return imageData;

}

结果: