zoukankan      html  css  js  c++  java
  • Canvas绘图

    基本用法
    1、要使用canvas,必需先设置其width和height属性,指定绘图的大小,中间内容是后备信息,不支持的浏览器才显示

    <canvas id='drawing' width='200' height='200'> a drawing of something </canvas>

    2、要在这块画布上绘图,需要取得绘图上下文,而取得绘图上下文的调用,需要调用getContext()方法,传入2d

    var drawing = document.getElementById('drawing);
    //确定浏览器支持<canvas>元素
    if(drawing.getContext){
        var context = drawing.getContext('2d');
        //do sth
    }


    3、使用toDataURL()方法,可以导出再<canvas>元素上绘制的图像,比如:要取得画布中的一幅png格式的图像

    var drawing = document.getElementById('drawing);
    //确定浏览器支持<canvas>元素
    if(drawing.getContext){
        //取得图像的数据URI
        var imgURI = drawing.toDataURL('image/png');
        //显示图像
        var image = document.createElement('img');
        image.src = imgURI;
        document.body.appendChild(image);
    }

    2D上下文

    填充和描边
    填充:fillStyle属性,用指定的样式(颜色,渐变,图像)填充图形
    描边:strokeStyle属性,只在图形的边缘画线

    var drawing = document.getElementById('drawing');
    //确定浏览器支持<canvas>元素
    if(drawing.getContext){
        var context = drawing.getContext('2D');
        context.strokeStyle = '#0000ff';
        context.fillStyle = 'red';
    }

    他们指定表示颜色的字符串值,可以使用css中指定颜色值的任何格式,包括颜色名,十六进制,rgb , rgba , hsl , hsla。

    绘制矩形
    矩形是唯一一种可以直接再2d上下文绘制的形状。与矩形有关的方法fillRect(),strokeRect(), clearRect()。
    这三个方法接收4个参数,矩形的x坐标,矩形的y坐标,矩形宽度和矩形高度

    fillRect():在画布绘制的矩形会填充指定的颜色
    strokeRect():在画布上绘制的矩形会使用指定的颜色描边
    clearRect():清除画布上的矩形区域

    var drawing = document.getElementById('drawing');
    //确定浏览器支持<canvas>元素
    if(drawing.getContext){
        var context = drawing.getContext("2d");
    
        //绘制红色矩形
        context.fillStyle = "#ff0000";
        context.fillRect(10, 10, 50, 50);
        context.strokeStyle = "#0000ff";
        context.strokeRect(10,10,50,50);
    
        //绘制半透明的蓝色矩形
        context.fillStyle = "rgba(0, 0, 255, 0.5)";
        context.fillRect(30, 30, 50, 50);
        context.strokeStyle = "#ff0000";
        context.strokeRect(30,30,50,50);
    
        //在两个矩形重叠的地方消除一个小矩形
        context.clearRect(30, 30, 30, 30);
    }

    绘制一个不带数字的时钟表盘
    要绘制路径,首先必须调用beginPath()方法,表示要开始绘制新路径
    arc(x, y, radius, startAngle, endAngle, counterclockwise):以(x,y)为圆心绘制一条弧线,弧线半径为radius,
    起始和结束角度(用弧度表示)分别为startAngle和endAngle。最后一个参数表示startAngle和endAngle是否按逆时针方向计算,
    值为false表示按顺时针方向计算
    moveTo(x, y):将绘图游标移动到(x,y),不画线
    lineTo(x,y):从上一点开始绘制一条线,到(x,y)为止

    var drawing=document.getElementById("drawing"); 
    //确定浏览器支持<canvas>元素
    if(drawing.getContext){
        var context = drawing.getContext("2d");
    
        //开始路径
        context.beginPath();
    
        //绘制外圆
        context.arc(100, 100, 99, 0, 2 * Math.PI, false); 
        //PI在数学方法中为π,而此时的π在角度里为180°,Math.PI/180就为1°
    
        //绘制内圆
        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();
    }    


    绘制文本
    font:表示文本样式,大小及字体。
    textAlign:表示文本对齐方式。注意左右用'start'和'end'。可能的值有'start','end','left','right','center'
    textBaseline:表示文本的基线。 可能的值有'top','middle','bottom','hanging','alphabetic','ideogrphic'

    context.font = "bold 14px Arial";
    context.textAlign = "center";
    context.textBaseline = "middle";
    context.fillText("12", 100, 20);

    如果需要把文本控制在某一区域中的时候,2d上下文提供了辅助确定文本大小的方法measureText()。这个方法接收一个参数,既要绘制的文本。

    返回的对象目前只有一个width属性,但将来还会增加更多度量属性

    var fontSize = 100;
    context.font = fontSize + 'px Arial';
    while(context.measureText('Hello word').width > 100){
        fontSize--;
        context.font = fontSize + 'px Arial';
    }
    context.fillText('Hello word', 170, 150);
    context.fillText('Font size is ' + fontSize + 'px', 210, 120);


    绘制变换
    translate(x,y):将坐标原点移动到(x,y)。执行这个变换后,坐标(0,0)会变成之前的(x,y)表示的点。

    context.translate(100,100)

    rotate(angle):围绕原点旋转图像angle弧度

    context.rotate(1); //以弧度为单位,360°角=2π弧度,1弧度=57.3°角,1°角=π/180弧度

    绘制图像
    如果想要把一幅图像绘制到画布上,可以使用drawImage()方法。调用这个方法时,有三种不同的参数组合
    1)drawImage(image, 10, 10):表示绘制的源图像起点的坐标10,10,这里没有指定大小,所以与原始大小一样
    2)drawImage(image, 10, 10, 50, 50):后面新增的两个参数表示图像大小是50*50像素
    3)drawImage(image, 10, 10, 50, 50, 100, 100, 20, 20):后面新增的四个参数表示目标图像的起点(100,100),目标图像的大小20*20像素

    var image = new Image();
    image.src='timg.jpeg';
    image.onload = function(){ //需要图片装载完后才能使用此图片
        context.drawImage(image, 0, 0, 200, 200);
    }

    绘制阴影
    2D上下文会根据以下几个属性的值,自动为形状或路径绘制出阴影
    shadowColor: 用css颜色格式表示的阴影颜色,默认为黑色。
    shadowOffsetX: 形状或路径x轴方向的阴影偏移量,默认为0
    shadowOffsetY: 形状或路径y轴方向的阴影偏移量,默认为0
    shaodowBlur: 模糊的像素数,默认为0, 即不模糊。

    //绘制阴影
    context.shadowColor = 'rgba(0, 0, 0, 0.5)';
    context.shadowOffsetX = 5;
    context.shadowOffsetY = 5;
    context.shaodowBlur = 4;

    绘制渐变
    1)渐变
    渐变由CanvasGradient实例表示,要创建一个新的线性渐变,可以调用createLinearGradient()方法,这个方法接收4个参数
    起点的x坐标,起点的y坐标,终点的x坐标,终点的y坐标。调用后就会创建一个指定的渐变。
    创建渐变后,就是使用addColorStop()方法来指定色标,这个方法接收两个参数:色标位置和CSS颜色值。色标位置是一个0(开始的颜色)
    到1(结束到颜色)之间到数字

    //绘制渐变
    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);

    为了覆盖整个矩形,矩形和渐变到坐标必须匹配才行

    //绘制渐变
    var gradient = context.createLinearGradient(30, 30, 70, 70);
    gradient.addColorStop(0, "white");
    gradient.addColorStop(1, "black");
    //绘制半透明的蓝色矩形
    context.fillStyle = gradient;
    context.fillRect(50, 50, 50, 50);

    这样只会显示部分渐变效果,只有左上角到一点白色,这是因为矩形的起点位于渐变的中间位置,而次渐变已经快结束了。
    确保渐变的形状对齐非常重要,有时候可以考虑使用函数来确保坐标

    function createRectLinearGradient(context, x, y, width, height){
        return context.createLinearGradient(x, y, x+width, y+height);
    }

    2)径向渐变(或放射渐变)
    使用createRedialGradient()方法。这个方法接收6个参数,前三个参数是起点圆的坐标和半径,后三个参数是终点圆的原心坐标和半径

    //绘制放射渐变
    var gradient = context.createRadialGradient(55, 55, 10, 55, 55, 30);
    gradient.addColorStop(0, "white");
    gradient.addColorStop(1, "black");
    //绘制渐变矩形
    context.fillStyle = gradient;
    context.fillRect(30, 30, 50, 50);

    因为创建比较麻烦,所以径向渐变并不那么容易控制,一般来说,让起点圆和终点圆保持为同心圆的情况比较多,这个时候只要考虑两个
    圆多设置不同的半径就好了。


    模式
    模式就是重复的图像,要创建一个新模式,可以调用createPattern()方法并传入两个参数:一个html元素和一个表示重复
    图像的字符串

    var context = drawing.getContext("2d");
    var image = new Image();
    image.src='1.jpg';
    image.onload = function(){ 
        var pat = context.createPattern(image,"repeat");
        context.fillStyle=pat;
        context.fillRect(0,0,500,500);
    }
  • 相关阅读:
    紫微斗数诸星分级及分类
    n次独立重复试验暨伯努利试验
    信息系统项目管理师上午综合知识试题解析: 项目集治理
    三点估算和PERT技术
    自己写操作系统---bootsector篇
    硬盘分区表知识—详解硬盘MBR
    如何在自定义端口上运行 Spring Boot 应用程序?
    查询所有同学的学号、姓名、选课数、总成绩
    查询平均成绩大于60分的同学的学号和平均成绩
    查询“001”课程比“002”课程成绩高的所有学生的学号;
  • 原文地址:https://www.cnblogs.com/wzndkj/p/8526294.html
Copyright © 2011-2022 走看看