一、什么是Canvas

Canvas 是H5的一部分,允许脚本语言动态渲染图像。Canvas 定义一个区域,可以由html属性定义该区域的宽高,javascript代码可以访问该区域,通过一整套完整的绘图功能(API),在网页上渲染动态效果图。

二、Canvas 能做什么

  1. 游戏:毫无疑问,游戏在HTML5领域具有举足轻重的地位。HTML5在基于Web的图像显示方面比Flash更加立体、更加精巧。

  2. 图表制作:图表制作时常被人们忽略,但无论企业内部还是企业间交流合作都离不开图表。现在一些开发者使用HTML/CSS完成图标制作。当然,使用SVG(可缩放矢量图形)来完成图表制作也是非常好的方法。

  3. 字体设计:对于字体的自定义渲染将完全可以基于Web,使用HTML5技术进行实现。

  4. 图形编辑器:图形编辑器能够100%基于Web实现。

  5. 其他可嵌入网站的内容:类似图表、音频、视频,还有许多元素能够更好地与Web融合,并且不需要任何插件。

三、Canvas基本用法

  1. 使用<canvas>必须先设置其width和height属性,指定可绘图区域大小,只指定宽高不添加样式或者绘制图像的话,在页面中将看不到该元素。

    <canvas id='draw' width='200px' height='200px'></canvas>
  2. 绘制图像的话,我们首先要取到canvas并调用getContext()方法,然后传入上下文名字(2D/3D),2D有两种基本绘图操作|填充(fillStyle)|描边(strokeStyle)|,这两个属性默认值为#000

    var draw = document.getElementById('draw');
    //确认浏览器是否支持<canvas>元素
    if(draw.getContext){
    var context = draw.getContext('2d');
    //给context绘制红色的边框
    context.strokeStyle = '#f00';
    //内部填充大草原的颜色
    context.fillStyle = '#0f0';
    }
  3. 使用toDataURL()方法,可以导出<canvas>元素上绘制的图像

    var draw = document.getElementById('draw');
    if(draw.getContext){
    //显示图像,toDataURL()获取到的是一串base64的字符串
    var drawURL = draw.toDataURL('image/png');
    var image = document.createElement('img');
    image.src = drawURL;
    document.body.appendChild(image);
    }
  4. 绘制矩形,主要有三个方法,fillRect()为矩形填充颜色、strokeRect()为矩形描边、clearRect()清除矩形。这三个方法都接收4个参数x/y/w/h,矩形的左上角坐标和宽高

    var draw = document.getElementById('draw');
    //确认浏览器是否支持<canvas>元素
    if(draw.getContext){
    var context = draw.getContext('2d'); //绘制红色矩形,绿色描边
    context.fillStyle = '#f00';
    context.strokeStyle = '#0f0';
    context.strokeRect(10,10,50,50);
    context.fillRect(10,10,50,50); //绘制绿色矩形,红色描边
    context.fillStyle = '#0f0';
    context.strokeStyle = '#f00';
    context.strokeRect(10,10,50,50);
    context.fillRect(10,10,50,50); //在两个矩形重叠的地方清除一个小矩形
    context.clearRect(40,40,10,10);
    }
  5. 绘制路径,通过路径可以创造出复杂的形状和线条,要绘制路径,首先要调用beginPath()方法,再通过以下方法来实际的绘制路径

    arc(x,y,radius,startAngle,endAngle,conterclockwise)
    (x,y)圆心坐标、radius半径、(startAngle,endAngle)起始角度和终止角度、conterclockwise顺时针(false)/逆时针(true) moveTo(x,y) 将游标移动到(x,y),不画线。可以用来修改所谓的上一点坐标* arcTo(x1,y1,x2,y2,radius)
    从上一点开始绘制一条曲线到(x2,y2),并且以给定的radius穿过(x1,y1) lineTo(x,y) 从上一点开始绘制一条直线,到(x,y) rect(x,y,width,height)
    从(x,y)开始绘制一个矩形,宽高为width、height。这个方法绘制的是矩形路径,而非strokeRect()和fillRect()所绘制的独立的形状 //接下来绘制一个不带数字的时钟
    var draw = document.getElementById('draw');
    if(draw.getContext){
    var context = draw.getContext('2d');
    //开始路径
    context.beginPath();
    //绘制外圆
    context.arc(100,100,99,0,2*Math.PI,false);
    //绘制内圆
    context.moveTo(194,100);
    context.arc(100,100,94,0,2*Math.PI,false);
    //绘制分针
    context.moveTo(100,100);
    context.lineTo(100,15);
    //绘制时针
    context.moveTo(100,100);
    context.lineTo(35,100);
    //描边路径
    context.stroke();
    context.strokeStyle = '#f00';
    }

    6 . 绘制文本,主要有两个方法,fillText(),strokeText(),都接收四个参数|text(要绘制的文本)|x|y|最大像素宽度(可选)|,这两个方法都已下列三个属性为基础

     font文字样式,大小,字体等
    textAlign 文本对其方式|start|end|left|right|center|
    textBaseline 文本的基线|top|hanging|middle|alphabetic|ideographic|bottom| //在表盘绘制12点
    context.font = 'bold 12px Arial';
    context.textAlign = 'center';
    context.textBaseline = 'middle';
    context.fillText('12',100,20);

    7 . 变换

     rotate(angel) 围绕原点旋转图像angle弧度
    scale(scaleX,scaleY) 缩放图像,x*scaleX,y*scaleY 默认1
    translate(x,y) 将坐标原点移动到(x,y) var draw = document.getElementById('draw');
    if(draw.getContext){
    var context = draw.getContext('2d');
    //开始路径
    context.beginPath();
    //绘制外圆
    context.arc(100,100,99,0,2*Math.PI,false);
    //绘制内圆
    context.moveTo(194,100);
    context.arc(100,100,94,0,2*Math.PI,false);
    //变换原点
    context.translate(100,100);
    //旋转表针
    context.rotate(1)
    //绘制分针
    context.moveTo(0,0);
    context.lineTo(0,-85);
    //绘制时针
    context.moveTo(0,0);
    context.lineTo(-65,0);
    //描边路径
    context.stroke();
    context.strokeStyle = '#f00';
    }

    8 . 绘制图像,drawImage()

     var img = document.getElementByTagNames('image')[0];
    context.drawImage(img,0,10,50,50,0,100,40,60);
    9个参数: 要绘制的图像 原图像|x|y|w|h| 目标图像|x|y|w|h|

    9 . 阴影和渐变

     阴影主要是以下几个属性值
    shadowColor
    shadowOffsetX : X轴阴影偏移量
    shadowOffsetY : Y轴阴影偏移量
    shadowBlur : 模糊像素数,默认0,不模糊 var context = draw.getContext('2d');
    //设置阴影
    context.shadowColor = 'rgba(210,210,210,.5)';
    context.shadowOffersetX = '5'; 渐变 创建一个新的线性渐变 createLinearGradient()方法,有四个参数|x1|y1|x2|y2|分别为起点的坐标和终点的坐标
    var gradient = context.createLinearGradient(30,30,70,70);
    gradient.addColorStop(0,'#fff'); //0表示开始
    gradient.addColorStop(1,'#000'); //1表示结束
    //使用定义好的渐变属性
    context.fillStyle = gradient; //填充的时候放入渐变
    context.fillRect(30,30,50,50); 创建一个放射渐变 createRadialGradient(),六个参数|x1|y2|radius1|x2|y2|radius2|分别为第一个圆心和半径第二个圆心和半径,用法和线性渐变相同

    10 . 使用图像数据,可以通过getImageData()取得原始图像数据。四个参数|x|y|w|h|。每个ImageData对象有三个属性,width/height/data,data是一个数组,内部存着每一个像素的数据,每个元素的值介于0-255之间

     var imgdata = context.getImageData(0,0,100,100);
    var data = imgdata.data,
    red = data[0],
    green = data[1],
    blue = data[2],
    alpha = data[3]; //实现一个灰色过滤器
    var draw = document.getElementById('draw');
    if(draw.getContext){
    var context = draw.getContext('2d');
    var img = document.getElementsByTagName('image')[0],
    imageData,data,
    i,len,average,
    red,green,blue,alpha;
    //绘制原始图像
    context.drawImage(img,0,0,100,100);
    //获取图像数据
    imageData = context.getImageData(0,0,img.width,img.height);
    data = imageData.data;
    for(i=0,len=data.length;i<len;i+=4){
    red = data[i];
    green = data[i+1];
    blue = data[i+2];
    alpha = data[i+3];
    //计算rgb的平均值
    average = Math.floor((red+green+blue)/3);
    //设置颜色值
    data[i] = average;
    data[i+1] = average;
    data[i+2] = average;
    }
    imageData.data = data;
    //把数据绘制在画布
    context.putImageData(imageData,0,0)
    }

H5使用Canvas绘图的更多相关文章

  1. 有趣的Javascript:只需一个JS让万恶的IE5、IE6、IE7、IE8全都支持H5原生Canvas绘图(有演示demo)

    该demo支持IE5以上任意内核的浏览器 查看演示demo:支持IE5以上版本的浏览器Canvas绘图demo 补充:chats.js和echarts等图表库也可以使用本方法兼容IE6以上浏览器 1. ...

  2. HTML5 Canvas绘图基本使用方法, H5使用Canvas绘图

    Canvas 是H5的一部分,允许脚本语言动态渲染图像.Canvas 定义一个区域,可以由html属性定义该区域的宽高,javascript代码可以访问该区域,通过一整套完整的绘图功能(API),在网 ...

  3. H5的canvas绘图技术

    canvas元素是HTML5中新添加的一个元素,该元素是HTML5中的一个亮点.Canvas元素就像一块画布,通过该元素自带的API结合JavaScript代码可以绘制各种图形和图像以及动画效果. 1 ...

  4. H5 canvas 绘图

    H5的canvas绘图技术   canvas元素是HTML5中新添加的一个元素,该元素是HTML5中的一个亮点.Canvas元素就像一块画布,通过该元素自带的API结合JavaScript代码可以绘制 ...

  5. H5新特性-canvas绘图--渐变对象路径(最复杂)--图片--变形操作

    今天的目标 3.1:canvas绘图--(重点掌握:渐变对象.路径.图片.变形) 3.2:canvas绘图--渐变对象 线性渐变: linearGradient 径向渐变: var g = ctx.c ...

  6. Canvas绘图之平移translate、旋转rotate、缩放scale

    画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transform()来改变,它们会对画布的变换矩阵产生影响. 函数 方法 描 ...

  7. HTML5 学习总结(四)——canvas绘图、WebGL、SVG

    一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...

  8. HTML5学习总结——canvas绘制象棋(canvas绘图)

    一.HTML5学习总结——canvas绘制象棋 1.第一次:canvas绘制象棋(笨方法)示例代码: <!DOCTYPE html> <html> <head> & ...

  9. 伙伴们休息啦canvas绘图夜空小屋

    HTML5 canvas绘图夜空小屋 伙伴们园友们,夜深了,休息啦,好人好梦... 查看效果:http://hovertree.com/texiao/html5/28/ 效果图如下: 代码如下: &l ...

随机推荐

  1. C# 定时器Timer

    static void Main(string[] args) { #region 定时器 TimerDemo td = new TimerDemo("TimerDemo", 10 ...

  2. Pycharm新建Python项目

    关于新建项目时配置项目环境(最好是每个项目单独的虚拟Python环境): Python为什么要使用虚拟环境-Python虚拟环境的安装和配置-virtualenv Pycharm创建Python项目 ...

  3. linux下的硬盘分区、格式化、挂载

    linux下的MBR(msdos)分区.格式化.挂载 在linux下,需要使用一块硬盘. 需要进行以下四步: 识别硬盘-----分区规划-----格式化-----挂载 步骤一:分区规划 MBR模式分区 ...

  4. 02 基础 卸载JDK 安装JDK Java程序运行机制

    基础 JDK:Java Development Kit(Java开发者工具 包含JRE和JVM) JRE:Java Runtime Environment(java运行时环境,包含JVM) JVM:J ...

  5. 聊聊视频中的编解码器,你所不知道的h264、h265、vp8、vp9和av1编解码库

    你知道FFmpeg吗?了解过h264/h265/vp8/vp9编解码库吗? 我们日常生活中使用最广泛的五种视频编码:H264(AVC).H265(HEVC).vp8.vp9.av1都分别是什么?由哪些 ...

  6. java笔记:00 数据类型

  7. 打靶笔记-04-vulnhub-Jangow

    打靶笔记-04-vulnhub-Jangow 前面两篇名称写成了vulhub,已经更改为vulnhub;vulhub的之后再找个时间集中打一遍. 一.靶机信息 Name: Jangow: 1.0.1 ...

  8. Intellij IDEA远程debug线上项目记录

    远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用. JAVA 支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过 ...

  9. 如何让 if/else 更优雅?

    if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼,有没有什么方法可以让我们避免来写这么多的 if else 呢? 1.使用 return 我 ...

  10. C 如何将输出的地址转化为十进制数

    •需求 这两天在看内存对齐的相关问题,因此产生了一个,如何将地址转换为十进制数? 对于如下程序: void func() { int a = 10; printf("a 的地址为:%p\n& ...