读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

读书笔记 - js高级程序设计 - 第十三章 事件

canvas
具备绘图能力的2D上下文 及文本API

很多浏览器对WebGL的3D上下文支持还不够好

有时候即使浏览器支持,操作系统如果缺缺乏必要的绘图驱动程序,则浏览器即使支持了也没用

 
<canvas>

var drawing = document.getElementById("drawing");

if( drawing.getContext ){

drawing.getContext("2d");

}

toDataURL
可以导出在canvas元素上绘制的图像

var src = drawing.toDataURL("image/png");

注意toDataURL是canvas对象的方法,不是上下文对象的方法

填充色 描边色
var context = drawing.getContext("2d")

context.strokeStyle = "red;

context.fillStyle = "#0000ff";

绘制矩形
fillRect( x,y,width,height);

strokeRect( x,y,width,height);

clearRect( x,y,width,height);

lineWidth

lineGap butt round square

lineJoin round bevel miter

绘制路径
beginPath()

arc() 画弧线

arcTo 从上一点开始绘制一条弧线

bezierCurveTo 穿过一个点 ,把两个点用弧线连起来

lineTo(x,y) 绘制直线

moveTo() 移动 不绘线

quadraticCurveTo( cx,cy,x,y ) 从上一点开发绘制一条二次曲线,到x,y为止,并且以cx cy为控制点

rect() 绘制一条矩形线路

closePath

fillStyle fill()

stokeStyle stoke()

clip()

isPointInPath 确定画面上的某一点是否位于路径上
绘制文本
fillText( str,x ,y ,最大像素宽度 )

strokeText( str, x, y, 最大像素宽度 )

 
font "px Arial"

textAlign  start end left right center

textBaseline top hanging middle alphabetic ideographic bottom

measureText()
var fontSize = 100

context.font = fontSize + "px Arial";

while( context.measureText("Hello world?").width > 140 ){

fontSize -- ;

context.font = fontSize + "px Arial" ;

}

context.fillText( "hello world!", 10, 10 ) ;

context.fillText("font size is" + fontSize + "px", 10, 50 ) ;

绘制变换
rotate( angle );

scale( scaleX, saleY ) 缩放图像

translate( x, y ) 更改原点

transform() 修改变换矩阵

setTransform() 先变换矩阵重置为默认状态,然后再调用 transform()

绘制变化和恢复
save

restore

绘制图像
var image = document.images[0] ;

context.drawImage( image, x, y, width, height ) ;

还可以

context.drawImage( image, orginalX, originalY, originalWidth, originalHeight, x, y, width, height ) ;

image这个参数也可以传其它canvas

阴影
只在在绘制前为它们设置适当的值,就能自动产生阴影

var context = drawing.getContext("2d");

context.shadowOffsetX = 5 ;

context.shadowOffsetY = 5 ;

context.shadowBlur = 4 ;

context.shadowColor = "rgba(0,0,0,0.5 ) ;

渐变
由CanvasGradient实例来演示

var gradient = context.createLinearGradient( 30, 30, 70, 70 );

gradient.addColorStop( 0, "white" ) ;

gradient.addColorStop( 1, "black" ) ;

context.fillStyle = gradient ;

context.fillRect( 30, 30, 50, 50 ) ;

注意要确保坐标匹配

  createRadialGradient()方法 放射渐变
模式
就是重复的图像

pattern = context.createPattern( image, "repeat");

context.fillStyle = pattern ;

context.fillRect ( 10, 10, 150, 150 ) ;

注意 模式与渐变一样,都是从原点开始的,并不是要从某个位置开始绘制重复的图像.

createPattern的第一个元素,也可以是video元素 或另一个canvas元素

使用图像数据
var imageData = context.getImageData( 10, 5, 50, 50 ) ;

这里返回的对象是ImageData的实例,每个实例对象有三个属性 width height data

data属性是一个数组,保存着图像中每一个像素的数据.

可以修改它,然后回写图像数据

imageData.data = data ;

context.putImageData( imageData, 0, 0 ) ;

用上述方法可以实现灰阶过滤器

合成
globalAlpha 全局透明度

globalCompositionOperation表示后绘制的图形怎样与先绘制的图形结合

这个属性的值是字符串,可能的值如下

source-over 默认值:

source-out

source-atop

destination-over

destination-in

destination-out

destination-atop

lighter

copy

xor

WebGL
针对Canvas的3D 上下文

www.learningwebgl.com 有非常棒的教程

 
类型化数组  typed arrays ,类型化数组也是数组.

ArrayBuffer的类型

var buffer = new ArrayBuffer( 20 ) ;// 分配20B

var num = buffer.byteLenght // 10 ;

var view = new DataView( buffer, 可选的字节偏移量,可选的要选择的字节数);

类型化视图 继承自DataView
WebGL上下文
var drawing = document.getElementById("drawing");

var param = {};

param.alpha = tue ;

param.depth = true 16位

param.stencil = // 可能使用8位模板缓冲区 默认值是false

param.antialias //表示将使用默认机制执行抗锯齿操作。默认值是true

param.premultipliedAlpha //值为true, 表示组图缓冲区有预乘Alph

param.preserveDrawingBuffer //值为true, 表示在组图完成后保留绘图缓冲区

if( drawing.getContext ){

var gl = drawing.getContext("experimental-webgl");

if( gl ){

//使用WebGL

}

}

WebGL常量 gl.COLOR_BUFFER_BIT
方法命名
类似

gl.uniform4f() 接收4个浮点数

gl.uniform3i() 接收3个整数

gl.uniform3iv()  接收包含3个整数的数组

准备绘图
gl.clearColor(0,0,0,1);

gl.clear( gl.COLOR_BUFFER_BIT ) ;

先清理缓冲区,然后再执行其它绘图操作

视口与坐标
gl.viewport( x, y, width, height );

坐标原点在左下角

  在视口内部 坐标原点是视口的中心
缓冲区
gl.createBuffer();

bindBuffer

bufferData

gl.getError()

着色器 shader 顶点着色器 和 片段着色器
编写着色器  
编写着色器程序  
为着色器传入值  
绘图 只能绘制点 线 三角
纹理 gl.createTexture() 然后再将一幅图像绑定到该纹理
读取像素
readPixels()

像素信息是从帧缓冲区读取的 

支持
Firefox4+ chrome Safari 5.1 都实现了WebGL API

但Safari里默认是禁用的

在使用WebGL之前,最好检测其是否得到了机算机驱动的支持,而不只是检测监测特定的浏览器版本。

WebGL是一个正在制定的发展中的规范,函数名 签名 数据类型 都有可能改变

可以说 WebGL目前只适合实验性地学习,不适合真正开发和应用.d

时间: 2024-08-02 10:54:39

读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图的相关文章

读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3

Node类型的变化   访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px" 计算的样式 记住所有计算的样式都是只读的 偏移量 offsetHeight 外边框外 offsetWidth offsetLeft  外边框外 到 左端 offsetTop  客户区的大小 clientWidth  内边框外缘 clientHeight 内边框外缘 滚动大小 scrollHeight

读书笔记 - js高级程序设计 - 第十章 DOM

文档元素 是文档的最外层元素,在Html页面中,文档元素始终都是<html>元素 在xml中,任何元素都可以是文档元素 Node类型 Node.ELEMENT_NODE 元素 Node.ATTRIBUTE_NODE 属性 Node.TEXT_NODE 文本元素 Node.CDATA_SECTION_NODE Node.ENTITY_REFERENCE_NODE Node.ENTITY_NODE Node.PROCESSING_INSTRUCTION_NODE; Node.COMMENT_NOD

读书笔记 - js高级程序设计 - 第八章 BOM

BOM的核心对象是window 它表示浏览器的一个实例,在浏览器中,window对象有双重角色,它既是通过js访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象,这意味着在网页中定义的任何一个对象,变量 和 函数 都以window作为其Global函数 窗口关系和frame 每个frame都有自己的window对象,并且保存在frames集合中, 在frames集合中,可能通过数值索引 或者 框架名称来访问 相应的 window 对象 top 始终指向 最高层的 框架,也就

JavaScript高级程序设计学习笔记第十五章--使用Canvas绘图

一.基本用法 1.要使用<canvas>元素,必须先设置其 width 和 height 属性,指定可以绘图的区域大小.能通过 CSS 为该元素添加样式,如果不添加任何样式或者不绘制任何图形,在页面中是看不到该元素的. 2.要在这块画布(canvas)上绘图,需要取得绘图上下文.而取得绘图上下文对象的引用,需要调用getContext()方法并传入上下文的名字.在使用<canvas>元素之前,首先要检测 getContext()方法是否存在,这一步非常重要.检测可以用如下方法进行:

读书笔记 - js高级程序设计 - 第七章 函数表达式

闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者只在绝对必要时再考虑使用闭包 模块模式   增强的模块模式   特权方法 有权访问私有变量的公有方法叫做特权方法 块级作用域   实现单例的特权方法  

读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中 执行环境的销毁 某个执行环境中的所有代码执行完毕后 该环境被销毁 保存在其中的所有变量了函数定义也会随之销毁 作用域链中的对象 全局执行环境的变更对象始终都是作用域链中的最后一个对象 没有块级作用域 if 和 for 内的变量 外部也可以访问 标记清除 不同浏览器 只不过垃圾时间的长短不同 引

读书笔记 - js高级程序设计 - 第三章 基本概念 -

启用严格模式 "use strict" 这是一个 pragma 编译指示 让编码意图更清晰  是一个重要原则 5种简单数据类型 Undefined Null Boolean Number String 1种复杂数据类型 Object 检测数据类型的方法 typeof 有如下值: undefined boolean object string number function typeof Null object 意在保存对象还没有保存对象的变量的初始值最好是什么 null 八进制的第一位

读书笔记 - js高级程序设计 - 第六章 面向对象的程序设计

EcmaScript有两种属性 数据属性 和 访问器属性 数据属性有4个特性 Configurable Enumerable Writable Value 前三个值的默认值都为false 举例 Object.defineProperty( person, "name", { writable:false, value:"niko"} ) ; 一旦属性定义为不可配置的,就不能再把它变回可配置的了 读取属性 的特性 var descriptor  = Object.ge

读书笔记 - js高级程序设计 - 第十一章 DOM扩展

对DOM的两个主要的扩展 Selectors API HTML5 Element Traversal 元素遍历规范 querySelector var body = document.querySelector("body"); var myDiv = document.querySelector("#myDiv"); 取得id为myDiv的元素 var selected = document.querySelector(".selected")