首页 > 其他分享 >canvas基础4

canvas基础4

时间:2023-04-09 16:38:21浏览次数:36  
标签:10 canvas image 基础 globalCompositeOperation context 图形 data

canvas基础4

一、图案

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

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

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

图案 canvas01.png

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

图案2 canvas02.png

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

图案3 canvas03.png

let image = new Image();
image.src = star.png;
pattern = context.createPattern(image, "no-repeat");
// 画一个矩形
context.fillStyle = pattern;
context.fillRect(10, 10, 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

标签:10,canvas,image,基础,globalCompositeOperation,context,图形,data
From: https://blog.51cto.com/u_14483476/6178882

相关文章

  • 算法基础
    语言基础取地址符我们可以用&读取变量的地址。特别的,对于数组,使用"数组名+元素"可以获得该变量的地址。例如\(f+1\)就是\(f\)数组第\(1\)个元素的地址。在C/C++中,指针变量的类型为类型名后加上一个*,例如int类型的指针为int*。要想访问指针变量地址所对应的......
  • java基础-异常
    1.简介如果某个方法不能按照正常的途径完成任务,在这种情况下会抛出一个封装了错误信息的对象,此时这个方法会立刻退出同时不返回任何值,调用这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器自定义异常的话是继承一个异常类,通常是RumtimeException或者E......
  • 9_1 程序设计语言与语言处理程序基础
    9.1法律法规知识(知识产权)前言9.2法律法规知识(保护期限)9.3法律法规知识(知识产权人确定)委托创作,合作开发9.4法律法规知识(侵权判定)9.5法律法规知识(标准的分类与标准的编号)......
  • java基础-序列化和拷贝
    1.序列化1.1.定义如果我们需要持久化Java对象,或者在⽹络传输Java对象,这些场景都需要⽤到序列化,简单来说序列化就是将数据结构或对象转换成⼆进制字节流的过程,反序列化就是将在序列化过程中所⽣成的⼆进制字节流转换成数据结构或者对象的过程对于Java这种⾯向对象编程语⾔来说,......
  • java基础-代理
    1.代理简介2.静态代理3.动态代理3.1.jdk使用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理,JDK创建代理对象效率较高,但是执行效率较低使用流程:实现InvocationHandler接口,重写invoke(),使用Proxy.newProxyInstance()产生代理对象,被代理的对象......
  • java基础-反射
    1.反射定义反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java反射机制动态语言定义:动态语言是指程序在运行时可以改变其结构,新的函数可以引进,已有的......
  • java基础知识合集-io
    1.IO简介2.IO分类2.1.流分类按照流的流向分,可以分为输入流和输出流按照操作单元划分,可以划分为字节流和字符流按照流的角色划分为节点流和处理流JavalO流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在紧密的联系,JavalO流的40多个类都是从如下4个抽......
  • 【MySQL】MySQL基础07— SQL学习 — DQL — 分组查询(转载请注明出处)
    SQL学习—DQL—分组查询5.分组查询背景:在分组函数的内容中,我们提及和分组函数一起查询的字段会有限制,产生错误。因为分组函数是将所以的参数统计成一个结果,而查询的字段是返回符合条件的个数,那么就会出错。所以引入了分组查询,将表中的相同的内容切分成数块,然后分别进行统......
  • Django基础 - 05Model模型之CRUD
     一、模型类的objects1.1objects字段默认情况下,由创建模型类的元类在模型类中创建一个 django.db.models.Manager类的对象,赋给objects。 Manager类实际是QuerySet类的子类。classCategoryEntity(models.Model):objects=models.Manager()#objects必须为......
  • 【转载】深入剖析三维几何内核(1)--基础
    转载深入剖析三维几何内核(1)--基础本文将对几何内核涉及的专业术语,设计理念,应用领域,以及现状做进一步的介绍。-------------------------------------------计算机中表示三维形体的模型,按照几何特点进行分类,大体上可以分为三种:线框模型、表面模型和实体模型。如果按照表示物......