这段时间做项目需要用canvas。

而我在看文档的时候,发现canvas是一个很独立的API:和DOM BOM基本上没什么关系。

在学习canvas的时候需要了解很多概念,否则看某些文档的讲解可能会看不懂,比如MDN。

那么,第一步。

<canvas id="canvas"></canvas>
var element = document.getElementById("canvas")

HTMLCanvasElement

刚才声明的变量 element 就是 HTMLCanvasElement,即canvas网页元素。

HTMLCanvasElement 有width 和height ,而且有默认值。

这个问题在图像操作时尤为重要——要想让你的canvas图片不扭曲,就必须主动设置weidh和height。用CSS是不行的,HTMLCanvasElement可以用CSS设定为你想要的大小,但图片会扭曲。

可以直接赋值(用js或者直接写HTML里都可以)设置,也可以通过js(jquery)的方法设置。

// 直接赋值
element.width = 500
// js赋值
element.getAttribute("width", 500)
// jquery赋值
$(element).attr("width", 500)

CanvasRenderingContext2D

CanvasRenderingContext2D,几乎是一切canvas操作的起点。

在HTMLCanvasElement上调用方法可以得到。

var ctx = element.getContext('2d');

这里的 ctx 就是 CanvasRenderingContext2D 对象。

顺便一提,getContext()方法有两种参数,一个是"2d",另一个是"experimental-webgl"(webgl用,这里不涉及)。

有了CanvasRenderingContext2D,我们就可以做各种各样的事情了。

像素控制为例。

说到像素控制,就又要引入一个新概念了。

ImageData

CanvasRenderingContext2D调用getImageData()方法可以获得ImageData对象。

var ImageData = ctx.getImageData(sx, sy, sw, sh);

这4个参数都是必须要传的。

sx 将要被提取的图像数据矩形区域的左上角 x 坐标。

sy 将要被提取的图像数据矩形区域的左上角 y 坐标。

sw 将要被提取的图像数据矩形区域的宽度。

sh 将要被提取的图像数据矩形区域的高度。

ImageData对象有3个属性,其中比较重要的是data属性。

注意:这三个属性都是只读的。

就是说,你可以改ImageData,也可以改ImageData.data里面的值,但是你不能直接改ImageData.data。

ImageData.data

ImageData.data属性返回一个Uint8ClampedArray数组。

Uint8ClampedArray是一种特殊的数组。

Uint8ClampedArray(8位无符号整型固定数组) 类型化数组表示一个由值固定在0-255区间的8位无符号整型组成的数组;如果你指定一个在 [0,255] 区间外的值,它将被替换为0或255;如果你指定一个非整数,那么它将被设置为最接近它的整数。(数组)内容被初始化为0。一旦(数组)被创建,你可以使用对象的方法引用数组里的元素,或使用标准的数组索引语法(即使用方括号标记)。

那么,颜色数据是怎么被记到这个数组里面的?

其实很简单。

首先,这是一个一维数组,里面全是0-255的数字。

其次,一个像素点需要4个数字来表示:R通道、G通道、B通道,alpha通道。

var data = ImageData.data
data[0]:red
data[1]:green
data[2]:blue
data[3]:alpha opacity
data[4]:red
...
data[data.length - 1]:alpha opacity

data[0]:第一个像素点的R通道值。

data[1]:第一个像素点的G通道值。

data[2]:第一个像素点的B通道值。

data[3]:第一个像素点的alpha通道值。

data[4]:第2个像素点的R通道值。

...

即ImageData.data.length %4 === 0(ImageData.data.length一定可以被4整除)。

比如有个100*100的canvas区域,有10000个点,那么ImageData.data里面就有40000个值。

循环里面的数值进行修改就可以做各种各样的颜色操作了。(比如反色就是RGB通道:255-x)

以上。以后可能会更新。

 

canvas : 几个入门需要的基本概念的更多相关文章

  1. html5 Canvas绘制图形入门详解

    html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...

  2. JAVAEE——BOS物流项目13:Quartz入门案例、核心概念、cron 表达式的格式(了解)

    1.quartz入门案例 本入门案例基于spring和quartz整合完成. 第一步:创建maven工程,导入spring和quartz相关依赖 第二步:创建任务类 第三步:在spring配置文件中配 ...

  3. Spring入门及IoC的概念

    Spring入门 Spring是一个轻量级的Java开发框架,最早由Robd Johnson创建,目的为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,它是一个分层的JavaSE/EE轻量级开源 ...

  4. 快速入门系列--CLR--01基本概念

    在.NET平台用C#这么久,自然会发现其版本很多,相应的概念也会很多,常常都是萌萌哒.而在实际工作中经常会遇到需要配置dll版本号,公钥token等场景,因而对C#.NET.CLR.框架类型等基础概念 ...

  5. 快速入门系列--WCF--01基础概念

    转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...

  6. 快速入门系列--TSQL-01基础概念

    作为一名程序员,对于SQL的使用算是基础中的基础,虽然也写了很多年的SQL,但常常还是记不清一些常见的命令,故而通过一篇博文巩固相关的记忆,并把T-SQL本身的一些新特性再进行一次学习. 首先回顾基础 ...

  7. MongoDB入门二:基本概念

    前言 工欲善其事必先利其器.在学习MongoDB之前,需要对MongoDB的一些基本概念有系统的了解. 所以,本篇文章主要介绍MongoDB的一些基本概念,这些概念的定义均来自<MongoDB权 ...

  8. 《Java从入门到放弃》JavaSE入门篇:面向对象概念(入门版)

    要知道什么是面向对象,你首先要有个对象吧,所以······没有对象的可以回家洗洗睡了· 好吧,前面是开玩笑,要说明什么是面向对象,我们还是先 例子: 小呆:"小傻,你今天早餐吃的什么?&qu ...

  9. JMeter入门(01)概念和样例

    一.概念 JMeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台,实现了许多和互联网相关的网络测试组件,同时还保留着很强的扩展性. JMeter可以用来测试诸如:静态文件,Java Ser ...

随机推荐

  1. 2.WebPack初始化

    一.Package.json 在项目中输入: npm init 之后会提示你一步一步输入信息,我输入的信息如下: 生成的Package.json文件如下 我们也可以在初始时省略这些步骤,让脚本使用默认 ...

  2. 《T-GCN: A Temporal Graph Convolutional Network for Traffic Prediction》 论文解读

    论文链接:https://arxiv.org/abs/1811.05320 最近发现博客好像会被CSDN和一些奇怪的野鸡网站爬下来?看见有人跟爬虫机器人单方面讨论问题我也蛮无奈的.总之原作者Misso ...

  3. MongoDB快速入门教程 (2)

    2.MongoDB的基本的CRUD操作 2.1.创建文档 在具体操作之前,想要知道有多少数据库,可以执行下面命令 show dbs 在mongodb中,数据库中包含的叫做集合(表),集合中存储的内容叫 ...

  4. 判断CString 字符串里面是否全部为数字

    //原理就是去除0-9的数字,判断去除数字后的字符串是否为空,如果为空,说明字符串全部都是为数字,否则得话,就不是. strOutTimeOnNum = strouttime.TrimLeft( _T ...

  5. Linux下nginx反向代理服务器安装与配置实操

    1.我们只要实现访问nginx服务器能跳转到不同的服务器即可,我本地测试是这样的, 在nginx服务器里面搭建了2个tomcat,2个tomcat端口分别是8080和8081,当我输入我nginx服务 ...

  6. 6.30集训模拟赛4(炸裂的一天qwq)

    T1浇水: 题目描述 在一条长n米,宽m米米的长方形草地上放置着k个喷水装置.假设长方形草地的坐标范围为[ 0 , 0 ] ~ [ n , m ],那么第 i 个喷水装置的位置为(ai,m/2),也就 ...

  7. Windows7 PowerShell 2.0升级到 PowerShell 5.1

    Windows7 sp1内置的PowerShell的版本是v2.0,现需要将其升级到v5.1,过程中有一个环节需要引起注意,为了以后查阅的方便,现将其记录下来. 1 查看PowerShell版本 Wi ...

  8. css两端对齐——div+css布局实现2端对齐的4种方法总结

    div+css布局实现2端对齐是我们网页排版中经常会使用到的,这篇文章将总结一下可以实现的方法: html结构 实现demo里面的div通过Css进行2端对齐. <div class=" ...

  9. P4408 逃学的小孩 题解

    题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心 ...

  10. The Shortest Statement,题解

    题目链接 分析: 还是很明白的题意,直接分析问题,首先,这一题真的是给spfa用武之地,m比n大不超过20,但是这并不能使暴力不t,我们考虑一下如何改进一下,我们这样想,这个图只比它的生成树多最多21 ...