`

Canvas API

 
阅读更多
Canvas API

来自《JavaScript 标准参考教程(alpha)》,by 阮一峰
http://javascript.ruanyifeng.com/htmlapi/canvas.html#toc4

Canvas API(画布)用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap)。

使用前,首先需要新建一个canvas网页元素。

<canvas id="myCanvas" width="400" height="200">
    您的浏览器不支持canvas!
</canvas>
上面代码中,如果浏览器不支持这个API,则就会显示canvas标签中间的文字——“您的浏览器不支持canvas!”。

每个canvas元素都有一个对应的context对象(上下文对象),Canvas API定义在这个context对象上面,所以需要获取这个对象,方法是使用getContext方法。

var canvas = document.getElementById('myCanvas');

if (canvas.getContext) {
    var ctx = canvas.getContext('2d');
}
上面代码中,getContext方法指定参数2d,表示该canvas对象用于生成2D图案(即平面图案)。如果参数是3d,就表示用于生成3D图像(即立体图案),这部分实际上单独叫做WebGL API(本书不涉及)。

canvas画布提供了一个用来作图的平面空间,该空间的每个点都有自己的坐标,x表示横坐标,y表示竖坐标。原点(0, 0)位于图像左上角,x轴的正向是原点向右,y轴的正向是原点向下。

(1)绘制路径

beginPath方法表示开始绘制路径,moveTo(x, y)方法设置线段的起点,lineTo(x, y)方法设置线段的终点,stroke方法用来给透明的线段着色。

ctx.beginPath(); // 开始路径绘制
ctx.moveTo(20, 20); // 设置路径起点
ctx.lineTo(200, 20); // 绘制一条到200, 20的直线
ctx.lineWidth = 1.0; // 设置线宽
ctx.strokeStyle = "#CC0000"; // 设置线的颜色
ctx.stroke(); // 进行线的着色,这时整条线才变得可见
moveto和lineto方法可以多次使用。最后,还可以使用closePath方法,自动绘制一条当前点到起点的直线,形成一个封闭图形,省却使用一次lineto方法。

(2)绘制矩形

fillRect(x, y, width, height)方法用来绘制矩形,它的四个参数分别为矩形左上角顶点的x坐标、y坐标,以及矩形的宽和高。fillStyle属性用来设置矩形的填充色。

ctx.fillStyle = 'yellow';
ctx.fillRect(50, 50, 200, 100);
strokeRect方法与fillRect类似,用来绘制空心矩形。

ctx.strokeRect(10,10,200,100);
clearRect方法用来清除某个矩形区域的内容。

ctx.clearRect(100,50,50,50); 
(3)绘制文本

fillText(string, x, y) 用来绘制文本,它的三个参数分别为文本内容、起点的x坐标、y坐标。使用之前,需用font设置字体、大小、样式(写法类似与CSS的font属性)。与此类似的还有strokeText方法,用来添加空心字。

// 设置字体
ctx.font = "Bold 20px Arial";
// 设置对齐方式
ctx.textAlign = "left";
// 设置填充颜色
ctx.fillStyle = "#008600";
// 设置字体内容,以及在画布上的位置
ctx.fillText("Hello!", 10, 50);
// 绘制空心字
ctx.strokeText("Hello!", 10, 100);
fillText方法不支持文本断行,即所有文本出现在一行内。所以,如果要生成多行文本,只有调用多次fillText方法。

(4)绘制圆形和扇形

arc方法用来绘制扇形。

ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
arc方法的x和y参数是圆心坐标,radius是半径,startAngle和endAngle则是扇形的起始角度和终止角度(以弧度表示),anticlockwise表示做图时应该逆时针画(true)还是顺时针画(false)。

下面是如何绘制实心的圆形。

ctx.beginPath();
ctx.arc(60, 60, 50, 0, Math.PI*2, true);
ctx.fillStyle = "#000000";
ctx.fill();
绘制空心圆形的例子。

ctx.beginPath();
ctx.arc(60, 60, 50, 0, Math.PI*2, true);
ctx.lineWidth = 1.0;
ctx.strokeStyle = "#000";
ctx.stroke();
(5)设置渐变色

createLinearGradient方法用来设置渐变色。

var myGradient = ctx.createLinearGradient(0, 0, 0, 160);

myGradient.addColorStop(0, "#BABABA");

myGradient.addColorStop(1, "#636363");
createLinearGradient方法的参数是(x1, y1, x2, y2),其中x1和y1是起点坐标,x2和y2是终点坐标。通过不同的坐标值,可以生成从上至下、从左到右的渐变等等。

使用方法如下:

ctx.fillStyle = myGradient;
ctx.fillRect(10,10,200,100);
(6)设置阴影

一系列与阴影相关的方法,可以用来设置阴影。

ctx.shadowOffsetX = 10; // 设置水平位移
ctx.shadowOffsetY = 10; // 设置垂直位移
ctx.shadowBlur = 5; // 设置模糊度
ctx.shadowColor = "rgba(0,0,0,0.5)"; // 设置阴影颜色

ctx.fillStyle = "#CC0000";
ctx.fillRect(10,10,200,100);
canvas允许将图像文件插入画布,做法是读取图片后,使用drawImage方法在画布内进行重绘。

var img = new Image();

img.src = "image.png";

ctx.drawImage(img, 0, 0); // 设置对应的图像对象,以及它在画布上的位置
由于图像的载入需要时间,drawImage方法只能在图像完全载入后才能调用,因此上面的代码需要改写。

var image = new Image();

image.onload = function() {

    if (image.width != canvas.width)
        canvas.width = image.width;
    if (image.height != canvas.height)
        canvas.height = image.height;

    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.drawImage(image, 0, 0);

}

image.src = "image.png";
drawImage()方法接受三个参数,第一个参数是图像文件的DOM元素(即img标签),第二个和第三个参数是图像左上角在Canvas元素中的坐标,上例中的(0, 0)就表示将图像左上角放置在Canvas元素的左上角。

getImageData方法可以用来读取Canvas的内容,返回一个对象,包含了每个像素的信息。

var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
imageData对象有一个data属性,它的值是一个一维数组。该数组的值,依次是每个像素的红、绿、蓝、alpha通道值,因此该数组的长度等于 图像的像素宽度 x 图像的像素高度 x 4,每个值的范围是0–255。这个数组不仅可读,而且可写,因此通过操作这个数组的值,就可以达到操作图像的目的。修改这个数组以后,使用putImageData方法将数组内容重新绘制在Canvas上。

context.putImageData(imageData, 0, 0);
对图像数据做出修改以后,可以使用toDataURL方法,将Canvas数据重新转化成一般的图像文件形式。

function convertCanvasToImage(canvas) {
  var image = new Image();
  image.src = canvas.toDataURL("image/png");
  return image;
}
上面的代码将Canvas数据,转化成PNG data URI。

save方法用于保存上下文环境,restore方法用于恢复到上一次保存的上下文环境。

ctx.save();

ctx.shadowOffsetX = 10;
ctx.shadowOffsetY = 10;
ctx.shadowBlur = 5;
ctx.shadowColor = "rgba(0,0,0,0.5)";

ctx.fillStyle = "#CC0000";
ctx.fillRect(10,10,150,100);

ctx.restore();

ctx.fillStyle = "#000000";
ctx.fillRect(180,10,150,100);
上面代码先用save方法,保存了当前设置,然后绘制了一个有阴影的矩形。接着,使用restore方法,恢复了保存前的设置,绘制了一个没有阴影的矩形。

通过getImageData方法和putImageData方法,可以处理每个像素,进而操作图像内容。

假定filter是一个处理像素的函数,那么整个对Canvas的处理流程,可以用下面的代码表示。

if (canvas.width > 0 && canvas.height > 0) {

    var imageData = context.getImageData(0, 0, canvas.width, canvas.height);

    filter(imageData);

    context.putImageData(imageData, 0, 0);

}
以下是几种常见的处理方法。

灰度图(grayscale)就是取红、绿、蓝三个像素值的算术平均值,这实际上将图像转成了黑白形式。假定d[i]是像素数组中一个象素的红色值,则d[i+1]为绿色值,d[i+2]为蓝色值,d[i+3]就是alpha通道值。转成灰度的算法,就是将红、绿、蓝三个值相加后除以3,再将结果写回数组。

grayscale = function (pixels) {

    var d = pixels.data;

    for (var i = 0; i < d.length; i += 4) {
      var r = d[i];
      var g = d[i + 1];
      var b = d[i + 2];
      d[i] = d[i + 1] = d[i + 2] = (r+g+b)/3;
    }

    return pixels;

};
复古效果(sepia)则是将红、绿、蓝三个像素,分别取这三个值的某种加权平均值,使得图像有一种古旧的效果。

sepia = function (pixels) {

    var d = pixels.data;

    for (var i = 0; i < d.length; i += 4) {
      var r = d[i];
      var g = d[i + 1];
      var b = d[i + 2];
      d[i]     = (r * 0.393)+(g * 0.769)+(b * 0.189); // red
      d[i + 1] = (r * 0.349)+(g * 0.686)+(b * 0.168); // green
      d[i + 2] = (r * 0.272)+(g * 0.534)+(b * 0.131); // blue
    }

    return pixels;

};
红色蒙版指的是,让图像呈现一种偏红的效果。算法是将红色通道设为红、绿、蓝三个值的平均值,而将绿色通道和蓝色通道都设为0。

red = function (pixels) {
   
    var d = pixels.data;

    for (var i = 0; i < d.length; i += 4) {
      var r = d[i];
      var g = d[i + 1];
      var b = d[i + 2];
      d[i] = (r+g+b)/3;        // 红色通道取平均值
      d[i + 1] = d[i + 2] = 0; // 绿色通道和蓝色通道都设为0
    }

    return pixels;

};
亮度效果(brightness)是指让图像变得更亮或更暗。算法将红色通道、绿色通道、蓝色通道,同时加上一个正值或负值。

brightness = function (pixels, delta) {

    var d = pixels.data;

    for (var i = 0; i < d.length; i += 4) {
          d[i] += delta;     // red
          d[i + 1] += delta; // green
          d[i + 2] += delta; // blue  
    }

    return pixels;

};
反转效果(invert)是指图片呈现一种色彩颠倒的效果。算法为红、绿、蓝通道都取各自的相反值(255-原值)。

invert = function (pixels) {

    var d = pixels.data;

    for (var i = 0; i < d.length; i += 4) {
        d[i] = 255 - d[i];
        d[i+1] = 255 - d[i + 1];
        d[i+2] = 255 - d[i + 2];
    }

    return pixels;

};


参考文档:
http://dev.w3.org/cvsweb/html5/canvas-api/Attic/canvas-2d-api.html
分享到:
评论

相关推荐

    HTML5 CanvasAPI

    与传统的图像加CSS的方法相比,Canvas API 提供了一种更为灵活和强大的渲染系统,可以动态生成内容,并且能够很好地处理用户交互和动画效果。 Canvas API 的历史可以追溯到苹果公司在MacOSX WebKit中提出的一个概念...

    MDN Canvas API 中文文档 20171202

    MDN Canvas API 中文文档 20171202 MDN Canvas API 中文文档 20171202

    Html5 Canvas API

    HTML5 Canvas API 是一个强大的网页图形绘制工具,它允许...提供的HTML5CanvasAPI.htm文件可能包含了这些知识点的实例代码,可以作为学习和参考的宝贵资源。而Image文件可能用于演示如何在Canvas上处理和绘制图像。

    HTML5canvasAPI

    此外,Canvas API还支持渐变(gradients)和模式(patterns)的使用,可以通过`createLinearGradient()`或`createRadialGradient()`创建线性渐变和径向渐变,再用它们作为`fillStyle`或`strokeStyle`来填充或描边...

    HTML 5 Canvas API

    Canvas API提供了大量的绘图方法,可以用于创建图像、图表、动画等,使得网页不再局限于静态文本和图片,而是可以拥有更加动态的表现形式。 1. 基本结构与属性: HTML5的Canvas元素是一个矩形区域,可以通过...

    HTML5 Canvas API 教程

    Canvas API 主要通过 `&lt;canvas&gt;` 元素来实现,该元素本身并不具备任何绘制功能,所有图形都需要通过 JavaScript 来实现。 #### 二、Canvas 接口元素定义 - **`&lt;canvas&gt;` 元素**:这是 HTML5 中用于图形渲染的一个...

    canvaspolygon使用CanvasAPI创建多边形

    在JavaScript开发中,Canvas API是一个强大的工具,用于在网页上绘制图形和动画。"canvas-polygon"项目就是利用Canvas API来创建多边形的一个实例。本文将深入探讨如何使用Canvas API来实现多边形的绘制,并结合...

    HTML5 Canvasapi的PPT详细讲义

    这9章内容全面而深入,不仅适合初学者理解Canvas API的基础,也适合有经验的开发者深入探索Canvas的高级特性和最佳实践。通过学习这份讲义,开发者能够掌握HTML5 Canvas API,从而在网页上创造出更加生动和交互的...

    基于HTML5 CanvasAPI的“俄罗斯方块”小游戏.zip

    在这个"基于HTML5 CanvasAPI的“俄罗斯方块”小游戏"中,我们可以看到HTML5的Canvas API是如何被用来创建一个经典的游戏体验的。 首先,Canvas API的核心是`&lt;canvas&gt;`元素,它在HTML中定义了一个画布,通过...

    Api-canvasapi.zip

    Api-canvasapi.zip,用于Instructure画布LMS的PythonAPI包装器。轻松管理课程、用户、成绩册等。,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并...

    OpenSC2K基于HTML5CanvasAPI和SQLite使用JavaScript重构SimCity2000

    在OpenSC2K中,Canvas API被用来渲染游戏的2D场景,包括城市地图、建筑物、车辆等元素。开发者可以通过JavaScript控制Canvas,进行像素级别的操作,实现细腻的画面效果和复杂的动画。Canvas API的使用极大地提高了...

    使用HTML5CanvasAPI和jwagner的SimplexNoise库创建了五个环境网页背景

    在这个项目中,"使用HTML5CanvasAPI和jwagner的SimplexNoise库创建了五个环境网页背景",开发者巧妙地结合了Canvas API与Simplex噪声算法,为网页设计了五种独特的背景样式。 Simplex噪声是一种在2D、3D甚至更高...

    uCharts是一款基于canvas API开发的适用于所有前端应用的图表库

    uCharts是一款基于canvas API开发的适用于所有前端应用的图表库,开发者编写一套代码,可运行到 Web、iOS、Android(基于 uni-app / taro ),支持H5、APP、小程序(微信小程序、支付宝小程序、钉钉小程序、百度小...

    canvas:Canvas是一个基于OpenGL或使用与HTML5 canvas API非常相似的软件渲染的Go图形库

    去画布 Canvas是一个纯Go库,提供的绘图功能与HTML5 canvas API尽可能相似。 它与HTML或Javascript无关,只是使它们的功能大致相同。 支持大多数功能,但仍在进行中。 该库旨在以与Javascript API相似的方式在每个...

    javascript canvas API内容整理

    JavaScript的Canvas API是Web开发中用于在网页上动态绘制图形的重要工具。HTMLCanvasElement是HTML5引入的一个元素,用于在浏览器中创建一个可绘制的2D图形区域。这个元素具有两个基本属性:`height`和`width`,分别...

    canvasapi:用于Instructure的Canvas LMS的Python API包装器。 轻松管理课程,用户,成绩簿等

    CanvasAPI CanvasAPI是用于访问Instructure的的Python库。 该库使开发人员能够以编程方式管理Canvas课程,用户,成绩簿等。 目录 安装 您可以使用pip安装CanvasAPI: pip install canvasapi 文献资料 完整文档可...

    canvas JavaScript API学习

    在JavaScript的世界里,Canvas API是一个强大的工具,它允许开发者在网页上进行动态的图形绘制,创造出丰富的视觉体验。Canvas API是HTML5的一部分,为Web应用提供了原生的2D绘图能力,无需依赖任何插件。这篇关于...

    node-canvas-api:使用Node.js访问Canvas API。 54个功能(还在增加)! 拉取请求受到欢迎和赞赏

    适用于Node.js的Canvas LMS API Canvas API函数捆绑为Node.js的NPM软件包。 入门 这些说明将为您提供在本地计算机上运行并运行的项目的副本,以与您自己的API令牌和Canvas域一起使用...canvasAPI . getSelf ( ) . th

    详解如何用HTML5 Canvas API控制图片的缩放变换

    本篇文章将详细讲解如何使用Canvas API中的`scale()`方法来控制图片的缩放变换。 首先,`scale(sx, sy)`方法接收两个参数,`sx`表示水平方向的缩放因子,`sy`则是垂直方向的缩放因子。例如,`context.scale(2, 2)`...

Global site tag (gtag.js) - Google Analytics