目录
1、概述
2、绘图方法
2.1 渐变
2.2 阴影 
图像处理方法" >3、图像处理方法
3.1 插入图像
3.2 读取Canvas的内容
3.3 像素处理
3.4 将Canvas转化为图像文件
4、保存和恢复上下文
首页 web前端 H5教程 HTML5新标签之Canvas详细介绍

HTML5新标签之Canvas详细介绍

Mar 30, 2017 pm 01:07 PM

1、概述

Canvas 用于在网页展示图像,并且可以定制内容,基本上它是一个可以用JavaScript操作的位图(bitmap)。

Canvas API用于网页实时生成图像,JavaScript通过API来操作图像内容。这样做的优点是:减少HTTP请求数,减少下载的数据,加快网页载入时间,可以对图像进行实时处理。

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

<canvas id="myCanvas" width="400" height="200">
    您的浏览器不支持canvas!
</canvas>
登录后复制

如果浏览器不支持canvas,则就会显示canvas标签中间的文字——“您的浏览器不支持canvas!”。

然后,使用JavaScript获取canvas的DOM对象

var canvas = document.getElementById(&#39;myCanvas&#39;);
登录后复制

接着,检查浏览器是否支持Canvas API,方法是看有没有部署getContext方法。

if (canvas.getContext) {    //some code here}
登录后复制

使用getContext('2d')方法,初始化平面图像的上下文环境。

var ctx = canvas.getContext(&#39;2d&#39;);
登录后复制

现在就在canvas中间生成平面图像了。

2、绘图方法

(1)填充颜色

设置填充颜色。

ctx.fillStyle = "#000000";//设置填充色为黑色ctx.strokeStyle = "#FF6600"; //设置笔触颜色
登录后复制

(2)绘制矩形

绘制实心矩形。

ctx.fillStyle = "#000000";//填充颜色,即矩形颜色ctx.fillRect(x, y, width, height);
登录后复制

绘制空心矩形。

ctx.strokeStyle = "#FF6600"; //笔触颜色,即矩形边框颜色ctx.strokeRect(x, y, width, height);
登录后复制

清除某个矩形区域的内容。

ctx.clearRect(x, y, width, height);
登录后复制

(3)绘制路径

ctx.beginPath(); //开始路径绘制
ctx.moveTo(20, 20); //设置路径起点
ctx.lineTo(200, 20); //绘制一条到200, 20的直线
ctx.lineWidth = 1.0; //设置线宽
ctx.strokeStyle = "#CC0000"; //设置线的颜色
ctx.stroke(); //进行线的着色,这时整条线才变得可见
登录后复制

(4)绘制圆形和扇形

绘制扇形的方法。

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)绘制文本

fillText方法用于添加文本,strokeText方法用于添加空心字。使用之前,需设定字体、对文方向、颜色等属性

ctx.font = "Bold 20px Arial"; //设置字体
ctx.textAlign = "left"; //设置对齐方式
ctx.fillStyle = "#008600"; //设置填充颜色
ctx.fillText("Hello!", 10, 50); //设置字体内容,以及在画布上的位置
ctx.strokeText("Hello!", 10, 100); //绘制空心字
登录后复制

fillText方法不支持文本断行,即所有文本出现在一行内。所以如果要生成多行文本,只有调用多次fillText方法。

2.1 渐变

设置渐变颜色。

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是终点坐标。通过不同的坐标值,可以生成从上至下、从左至右的渐变等等。

addColorStop方法的参数是(offset, color),其中offset是一个范围在0.0到1.0之间的浮点值,表示渐变的开始点和结束点之间的一部分,offset为0对应开始点,offset为1对应结束点,color为CSS颜色值的字符串表示。

使用方法如下:

ctx.fillStyle = myGradient;

ctx.fillRect(10, 10, 200, 100);
登录后复制

2.2 阴影

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);
登录后复制

3、图像处理方法

3.1 插入图像

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元素左上角。

3.2 读取Canvas的内容

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

var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
登录后复制

imageData对象有一个data属性,它的值是一个一维数组。该数组的值,依次是每个像素的红、绿、蓝、alpha通道值,因此该数组的长度等于图像的像素宽度 * 图像的像素高度 * 4,每个值的范围是 0~255。这个数组不仅可读,而且可写,因此通过操作这个数组的值,就可以达到操作图像的目地。修改这个数组后,使用putImageData方法将数组内容重新写回Canvas。

context.putImageData(imageData, 0, 0);
登录后复制

3.3 像素处理

假定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);

}
登录后复制

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

(1)灰度效果

灰度图(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;

}
登录后复制

(2)复古效果

复古效果(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;

}
登录后复制

(3)红色蒙版效果

红色蒙版指的是,让图像呈现一种偏红的效果。算法是将红色通道设为红、绿、蓝三个值的平均值,而将绿色通道和蓝色通道都设为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;
    }    return pixels;

}
登录后复制

(4)亮度效果

亮度效果(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;

}
登录后复制

(5)反转效果

反转效果(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;

}
登录后复制

3.4 将Canvas转化为图像文件

对图像数据作出修改以后,可以使用toDataURL方法,将Canvas数据重新转化成一般的图像文件形式。

<p style="margin-bottom: 7px;">function convertCanvasToImage(canvas) {    <br/>var image = new Image();<br/>    image.src = canvas.toDataURL("image/png");    <br/>    return image;<br/>}</p>
登录后复制

4、保存和恢复上下文

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, 150);

ctx.restore();

ctx.fillStyle = "#000000";
ctx.fillRect(180, 10, 150, 100);
登录后复制

 上面的代码一共绘制了两个矩形,前一个有阴影,后一个没有。

以上是HTML5新标签之Canvas详细介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
HTML 中的表格边框 HTML 中的表格边框 Sep 04, 2024 pm 04:49 PM

HTML 表格边框指南。在这里,我们以 HTML 中的表格边框为例,讨论定义表格边框的多种方法。

HTML 中的嵌套表 HTML 中的嵌套表 Sep 04, 2024 pm 04:49 PM

这是 HTML 中嵌套表的指南。这里我们讨论如何在表中创建表以及相应的示例。

HTML 左边距 HTML 左边距 Sep 04, 2024 pm 04:48 PM

HTML 左边距指南。在这里,我们讨论 HTML margin-left 的简要概述及其示例及其代码实现。

HTML 表格布局 HTML 表格布局 Sep 04, 2024 pm 04:54 PM

HTML 表格布局指南。在这里,我们详细讨论 HTML 表格布局的值以及示例和输出。

HTML 输入占位符 HTML 输入占位符 Sep 04, 2024 pm 04:54 PM

HTML 输入占位符指南。在这里,我们讨论 HTML 输入占位符的示例以及代码和输出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在这里我们还分别讨论了 HTML 有序列表和类型的介绍以及它们的示例

HTML onclick 按钮 HTML onclick 按钮 Sep 04, 2024 pm 04:49 PM

HTML onclick 按钮指南。这里我们分别讨论它们的介绍、工作原理、示例以及各个事件中的onclick事件。

在 HTML 中移动文本 在 HTML 中移动文本 Sep 04, 2024 pm 04:45 PM

HTML 中的文本移动指南。在这里我们讨论一下marquee标签如何使用语法和实现示例。

See all articles