canvas基础4

一、图案

// 图案是用于填充和描画图形的重复图像。

// 要创建新图案,可以调用 createPattern() 方法并传入两个参数。

let image = new Image();
image.src = 'star.png';
pattern = context.createPattern(image, "repeat");
// 画一个矩形
context.fillStyle = pattern;
context.fillRect(0, 0, 150, 150);

图案 canvas01.png

let image = new Image();
image.src = 'star.png';
pattern = context.createPattern(image, "repeat-x");
// 画一个矩形
context.fillStyle = pattern;
context.fillRect(0, 0, 150, 150);

图案2 canvas02.png

let image = new Image();
image.src = 'star.png';
pattern = context.createPattern(image, "repeat-y");
// 画一个矩形
context.fillStyle = pattern;
context.fillRect(0, 0, 150, 150);

图案3 canvas03.png

let image = new Image();
image.src = 'star.png';
pattern = context.createPattern(image, "no-repeat");
// 画一个矩形
context.fillStyle = pattern;
context.fillRect(0, 0, 150, 150);

图案4 canvas04.png

二、图像数据

// 2d 上下文比较强大的一种能力是可以使用 getImageDate() 方法获取原始图像数据。

let drawing = document.getElementById("drawing");
// 确保完全支持<canvas>
if (drawing.getContext) {
  let context = drawing.getContext("2d"),
    image = document.images[0],
    imageData, data,
    i, len, average,
    red, green, blue, alpha;
  
  // 绘制图像
  context.drawImage(image, 0, 0);  
  
  // 获取图像数据
  imageData = context.getImageData(0, 0, image.width, image.height);
  data = imageData.data;
  for (i=0, len=data.length; i < len; i+=4) {
  
    red = data[i];
    green = data[i+1];
    blue = data[i+2];
    alpha = data[i+3];
    
    // 得到rgb的平均值
    average = Math.floor((red + green + blue) / 3);
    
    // 设置颜色,不管透明度
    data[i] = average;
    data[i+1] = average;
    data[i+2] = average;
    
  }
  
  // 将修改后的数据写回 ImageData 并应用到画布上显示出来
  imageData.data = data;        
  context.putImageData(imageData, 0, 0);
}

图像数据 canvas05.png

三、合成

// 2d 上下文中绘制的所有内容都会应用两个属性:globalAlpha 和 globalComposition Operation。

// 绘制红色矩形
context.fillStyle = "#ff0000";
context.fillRect(10, 10, 50, 50);
// 修改全局透明度
context.globalAlpha = 0.5;
// 绘制蓝色矩形
context.fillStyle = "rgba(0,0,255,1)";
context.fillRect(30, 30, 50, 50);
// 重置
context.globalAlpha = 0;

合成 canvas06.png

// globalComposition Operation 属性表示新绘制的形状如何与上下文中已有的形状融合。

// 这个属性是一个字符串,可以取下列值。

// destination-over:新图形绘制在原有图形下面,重叠部分只有原图形透明像素下的部分可见。

// 绘制红色矩形
context.fillStyle = "#ff0000";
context.fillRect(10, 10, 50, 50);
// 设置合成方式
context.globalCompositeOperation = "destination-over";
// 绘制蓝色矩形
context.fillStyle = "rgba(0,0,255,1)";
context.fillRect(30, 30, 50, 50);

合成2 canvas07.png

// source-over:默认值,新图形绘制在原有的图形上面。

// source-in:新图形只绘制出与原有图形重叠的部分,画布上其余部分全部透明。

context.globalCompositeOperation = "source-in";

合成3 canvas08.png

// source-out:新图形只绘制出不与原有图形重叠的部分,画布上其余部分全部透明。

context.globalCompositeOperation = "source-out";

合成4 canvas09.png

// source-atop:新图形只绘制出与原有图形重叠的部分,原有图形不受影响。

context.globalCompositeOperation = "source-atop";

合成4 canvas10.png

// destination-in:新图形绘制在原有图形下面,画布上只剩下二者重叠的部分,其余部分完全透明。

context.globalCompositeOperation = "destination-in";

合成5 canvas11.png

// destination-out:新图形与原有图形重叠部分完全透明,原图形其余部分不受影响。

context.globalCompositeOperation = "destination-out";

合成6 canvas12.png

// destination-atop: 新图形绘制在原有图形下面,原有图形与新图形不重叠部分完全透明。

context.globalCompositeOperation = "destination-atop";

合成7 canvas13.png

// lighter:新图形与原有图形重叠部分的像素值相加,使该部分变亮。

context.globalCompositeOperation = "lighter";

合成8 canvas14.png

// copy: 新图形将擦除并完全取代原有图形。

context.globalCompositeOperation = "copy";

合成9 canvas15.png

// xor: 新图形与原有图形重叠部分的像素执行 ‘异或’ 计算。

context.globalCompositeOperation = "xor";

合成10 canvas16.png