Canvas系列绘制图片学习:绘制图片和渐变效果

news2024/11/18 20:20:13

我们现在已经可以绘制好多东西了,不过在实际开发中,绘制最多的当然是图片了,这章我们就讲讲图片的绘制。

绘制图片

绘制图片的API是drawImage,它的参数有三种情况:

// 将图片绘制在canvas的(dX, dY)坐标处
context.drawImage(Image, dX, dY);
// 将图片绘制在canvas的(dX, dY)坐标处 图片大小缩放至dWidth * dHeight
context.drawImage(Image, dX, dY, dWidth, dHeight);
// 原图片将会按照 左上角坐标为(sX, sY) 大小为sWidth * sHeight裁剪
// 然后再将图片绘制在canvas的(dX, dY)坐标处 图片大小缩放至dWidth * dHeight
// 注意参数的位置!!
context.drawImage(Image, sX, sY, sWidth, sHeight, dX, dY, dWidth, dHeight);

来一个例子:

var image = new Image();
image.src = "https://www.kai666666.com/2019/06/19/Canvas系列(6):绘制图片/lufei.jpeg";
image.onload = function (){
  context.drawImage(image, 10, 10);
}

 

由上面可知,图片必须加载完成以后才可以绘制,所以我们放在onload里面了,当然也可以使用img标签,如果我们的代码是在图片加载完后加载的就不会有什么问题。现在我们修改一下绘制的参数,如下:

context.drawImage(image, 10, 10, 100, 100);

 我们试一下参数最多的这个,如下:

context.drawImage(image, 0, 0, 120, 120, 10, 10, 100, 100);

 

当然drawImage除了可以绘制图片以外,还可以绘制canvas:

var canvas2 = document.createElement("canvas")
var context2 = canvas2.getContext("2d");
context2.fillRect(10,10,30,30);
// 这里绘制的是canvas元素
context.drawImage(canvas2, 0, 0);

 

当然除了可以绘制canvas以外还可以绘制video不过每次只能绘制一屏,如果希望绘制的图形也可以播放的话,那么就要循环多次调用绘图了。同样的如果图片是GIF的也不会动态播放出来,而是会显示第一张。这两种情况很少用到,就不在重复了。

双缓冲技术:使用老的技术来绘图可能会有闪屏的现象,这往往是每绘制一屏的时候,然后用一个空白的屏幕来清理全屏,这就导致屏幕有的时候会一闪一闪的。解决这个问题的办法就是双缓冲技术。双缓冲技术说的是把画布先画在一个离线的canvas(或者图片)上,然后再把这个canvas绘制到用户看到的canvas上,因为每次看到的都是新canvas的覆盖,并不需要渲染空白屏,所以就不会有闪屏现象了,H5中的canvas是默认拥有双缓冲的,所以我们不需要再处理了。

线性渐变

我们之前使用过一个属性叫fillStyle,我们可以看到几乎我们都给的是某个颜色,那么为什么不直接叫fillColor呢,因为他除了颜色还可以设置其他的值,就比如线性渐变。定义一个线性渐变,大致是这个样子:

// 创建一个线性渐变对象 (x1, y1)是起始坐标 (x2, y2)是结束坐标
var gradient = context.createLinearGradient(x1, y1, x2, y2);
// 在0~1的范围内 添加颜色 0是开始位置 1是结束位置
gradient.addColorStop(number, 'color1');
gradient.addColorStop(number, 'color2');
// 设置线性渐变
context.fillStyle = gradient;

现在来看一个例子

var gradient = context.createLinearGradient(0,0,300,150);
gradient.addColorStop(0,"black");
gradient.addColorStop(0.5,"white");
gradient.addColorStop(1,"red");
context.fillStyle = gradient;
context.fillRect(10,10,280,130);

 

径向渐变

径向渐变和线性渐变很像,用法如下:

// 创建一个径向渐变变对象 (x1, y1)是其实坐标 r1是起始半径 (x2, y2)是结束坐标 r2是结束半径
var gradient = context.createRadialGradient(x1, y1, r1, x2, y2, r2);
// 在0~1的范围内 添加颜色 0是开始位置 1是结束位置 和线性渐变是一样的
gradient.addColorStop(number, 'color1');
gradient.addColorStop(number, 'color2');
// 设置径向渐变
context.fillStyle = gradient;

现在来看一个例子

var gradient =  context.createRadialGradient(150, 75, 10, 150, 75, 100);
gradient.addColorStop(0,"black");
gradient.addColorStop(0.5,"white");
gradient.addColorStop(1,"red");
context.fillStyle = gradient;
context.fillRect(10,10,280,130);

 

由上我们可以看出,渐变开始往前会使用渐变的第一个颜色,渐变结束往后会使用渐变的最后一个颜色

图片背景

style不仅仅可以是颜色和渐变,当然也可以是图片了,语法大概是这个样子的:

// 创建图片背景 Image就是一个图像 repetition是重复的关键字
// repetition可选值有:"repeat|repeat-x|repeat-y|no-repeat" 意思非常明显
var pattern = context.createPattern(Image, repetition);
// 设置图片背景
context.fillStyle = pattern;

 

具体代码:

var image = new Image();
image.src = "https://www.kai666666.com/2019/06/19/Canvas系列(6):绘制图片/lufei.jpeg";
image.onload = function (){
  var pattern = context.createPattern(image, "repeat");
  context.font='30px 微软雅黑';
  context.fillStyle = pattern;
  context.fillText("带有炫酷背景的文字", 10, 85);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1112785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建react项目

一、环境准备 1、安装node 官网下载安装:https://nodejs.org/en 注: npm5.2以后,安装node会自动安装npm和npx 2、安装webpack npm install -g webpack3、安装create-react-app npm install -g create-react-app二、创建react项目 1、初…

宏offsetof的使用及其模拟实现

使用宏offsetof的时候需要包含<stddef.h>这个头文件。 宏offsetof有两个参数&#xff0c;第一个参数是结构体类型&#xff0c;第二个参数是结构体成员&#xff0c;计算的是结构体成员相较于结构体起始位置的偏移量&#xff0c;我们来看一个例子&#xff1a; 在这个例子中…

【试题027】C语言宏定义小例题

1.题目&#xff1a; #define MOD(a,b) a%b int main() { int x4,y16,z; zMOD(y,x); printf("%dn".z)&#xff1b;} 则程序执行的结果是? 2.代码分析&#xff1a; #include <stdio.h> #define MOD(a,b) a%b int main() {int x 4, y 16, z;z MOD(y, …

02、Python ------- 简单爬取下载小视频

简单爬取小视频 1、装模块 按键盘 winr 输入cmd , 输入命令&#xff1a; pip install requests 也有说在这个目录下面执行命令 pip install requests 执行失败 执行如果失败&#xff0c;在命令后面添加镜像 pip install requests -i https://mirrors.aliyun.com/pypi/sim…

23-数据结构-内部排序-归并排序

目录 归并排序 一、简介&#xff1a; 二、思路 三、代码 归并排序 一、简介&#xff1a; 归并&#xff0c;也叫合并&#xff0c;合二为一嘛&#xff0c;归并排序实际上相当于二叉树递归&#xff0c;先左右拆分&#xff0c;最后给数组拆分为每个数据为独立个体&#xff0c;…

易基因:WGBS等揭示植物基因体动态DNA甲基化与基因表达可塑性相关|Genome Biol

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 在一些真核生物中&#xff0c;DNA甲基化发生在基因编码区&#xff0c;称为基因体甲基化(gene body methylation&#xff0c;GbM)。尽管DNA甲基化在转座子和重复DNA沉默中的作用已得到很好…

MyBatis--多案例让你熟练使用CRUD操作

目录 一、前期准备 二、两种实现CRUD方式 三、增加数据&#xff08;INSERT&#xff09; 四、删除数据&#xff08;DELETE&#xff09; 五、查询数据&#xff08;SELECT&#xff09; 六、更新数据&#xff08;UPDATE&#xff09; 一、前期准备 1.创建maven项目并在pom文件…

vue3+element-plus 封装高度搜索组件,支持多种类型

目录 一、应用场景 二、开发流程 三、详细开发流程 1.新建文件 2.开始步骤 3.详细代码 (1).index.vue (2).搜索组件 (3).单个搜索组件 总结 一、应用场景 一般很多网站&#xff0c;有很多数据列表&#xff0c;基本都要做搜索的功能&#xff0c;如果涉及很多页面&…

从裸机启动开始运行一个C++程序(十一)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;十&#xff09; 从裸机启动开始运行一个C程序&#xff08;九&#xff09; 从裸机启动开始运行一个C程序&#xff08;八&#xff09; 从裸机启动开始运行一个C程序&#xff08;七&#xff09; 从裸机启动开始运…

Vant和ElementPlus在vue的hash模式的路由下路由离开拦截使用Dialog和MessageBox失效

问题复现 ElementPlus&#xff1a;当点击返回或者地址栏回退时&#xff0c;MessageBox无效 <template><div>Element Plus Dialog 路由离开拦截测试</div><el-button type"primary" click"$router.back()">返回</el-button>…

Vue3 + TypeScript

Vue3 TS开发环境创建 1. 创建环境 vite除了支持基础阶段的纯TS环境之外&#xff0c;还支持 Vue TS开发环境的快速创建, 命令如下&#xff1a; $ npm create vitelatest vue-ts-pro -- --template vue-ts 说明&#xff1a; npm create vitelatest 基于最新版本的vite进行…

Linux搭建文件服务器

搭建简单文件服务器 基于centos7.9搭建http文件服务器基于centos7.9搭建nginx文件服务器基于ubuntu2204搭建http文件服务器 IP环境192.168.200.100VMware17 基于centos7.9搭建http文件服务器 安装httpd [rootlocalhost ~]# yum install -y httpd关闭防火墙以及selinux [roo…

【Qt-20】Qt信号与槽

一、什么是信号和槽 信号是特定情况下被发射的事件&#xff0c;发射信号使用emit关键字&#xff0c;定义信号使用signals关键字&#xff0c;在signals前面不能使用public、private、protected等限定符&#xff0c;信号只用声明&#xff0c;不需也不能对其进行定义实现。另外&am…

【Jetson 设备】window10主机下使用VNC可视化控制Jetson Orin NX

文章目录 前言VNC连接搭建(WiFi模式)Jetson Orin NX操作本地主机操作 VNC连接搭建(以太网模式)Jetson Orin NX操作本地主机操作 总结 前言 最近需要使用Jetson Orin NX对一些深度学习算法进行测试&#xff0c;为了方便主机与Jetson Orin NX之间的数据的传输&#xff0c;以及方…

MATLAB - 不能使用PYTHON,缺少matplotlib模块的解决办法

matlab缺少python-matplotlib模块的解决办法 1. 前言、概述2. 解决办法3. 可能出现问题4. 结果 1. 前言、概述 起因是我用习惯的colormap函数getPyPlot_cMap不能用了&#xff1a;【这个函数要调用PYTHON】 报错的地方&#xff1a; ModuleNotFoundError: No module named ‘ma…

html中公用css、js提取、使用

前言 开发中&#xff0c;页面会有引用相同的css、js的情况&#xff0c;如需更改则每个页面都需要调整&#xff0c;重复性工作较多&#xff0c;另外在更改内容之后上传至服务器中会有缓存问题&#xff0c;特针对该情况对公用css、js进行了提取并对引用时增加了版本号 一、提取…

微信小程序开发之会议OA的会议界面,投票界面

一、自定义组件 1&#xff0c;自定义组件介绍 从小程序基础库版本 1.6.3 开始&#xff0c;小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以便在不同的页面中重复使用&#xf…

grpc实现跨语言(go与java)服务通信

Golang微服务实战&#xff1a;使用gRPC实现跨语言通信&#xff01;随着微服务架构的发展&#xff0c;越来越多的企业开始采用微服务架构来构建分布式系统。在微服务架构中&#xff0c;服务之间的通信是非常重要的。而gRPC作为一种高效、跨平台、跨语言的RPC框架&#xff0c;成为…

小目标检测闲谈

学术界在小目标检测领域的研究进展似乎已经相对缓慢&#xff0c;这一趋势在年度顶级学术会议的相关论文中也有所体现。这部分停滞可能与深度学习领域整体的发展趋势有关。然而&#xff0c;小目标检测仍然是一个具有重要应用潜力的领域&#xff0c;尤其在实际部署中&#xff0c;…

ChatGPT(1):ChatGPT初识

1 ChatGPT原理 ChatGPT 是基于 GPT-3.5 架构的一个大型语言模型&#xff0c;它的工作原理涵盖了深度学习和自然语言处理技术。以下是 ChatGPT 的工作原理的一些关键要点&#xff1a; 神经网络架构&#xff1a;ChatGPT 的核心是一个深度神经网络&#xff0c;采用了变种的 Tran…