文字对齐方式 :

  • 水平对齐

    1
    2
    3
    4
    //是用 textAlign 属性设置水平对齐方式(默认坐标点)
    ctx.textAlign = "start";
    ctx.font = "30px Arial";
    ctx.fillText("Hello World",100,50);

    //水平的三个坐标点分别为 start(a),left(a); center(b) ;end(c),right(c).

  • 垂直对齐:
    1
    2
    3
    4
    //是用 textBaseline 属性设置垂直对齐方式(默认坐标点)
    ctx.textBaseline = "bottom";
    ctx.font = "30px Arial";
    ctx.fillText("Hello World",100,50);

    //垂直的三个坐标点分别为 bottom(a),alphabetic(b);middle(c) ;top(d),hanging(d), //a 与 b 的差距等于canvas 最上边与浏览器最上边的差距。

图片操作:

  • 通过 <img>标签//此方法要插入图片

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //先在 html 中加入标签<img>插入图片
    <img id="face" src="face.jpg" alt="The Face" width="240" height="240" /></br> //注意 img 最
    后完整”/”,否则可能显示不出来。
    *****************************************************************
    <script>
    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");
    //在 canvas 中获取<img>标签id
    var img = document.getElementById("face");
    //给对象 img 添加onload 事件监听
    img.onload = function() {
    //通过函数 drawImage 将图片绘制到画板上
    ctx.drawImage(img,0,0);
    }
    </script> 
  • 通过 JavaScript 的Image 对象//此方法不需插入图片
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script>
    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");
    //建立 Image 对象
    var img = new Image();
    //通过 src 属性来加载图片
    img.src = "face.jpg";
    img.onload = function() {
    ctx.drawImage(img,0,0);
    }
    </script> 
  • drawImage 函数的三种函数模型 //注意参数只有这三种情况
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //三个参数分别是要绘制的对象,对象在 canvas 中定位的坐标值 X、Y 。(图片
    左上角点)
    drawImage(image,dx,dy); //参数为3
    //后两个参数分别是要绘制图片的宽度和高度。
    drawImage(image,dx,dy,dw,dh); //参数为5
    //多的四个参数分别是要截取图片部分的起始位置坐标 X、Y ,相对起始位置的
    宽和高。(指的是在要绘制的图片上截取后绘制在 canvas 上)
    drawImage(image,,sx,sy,sw,sh,dx,dy,dw,dh); //参数为 9
    例子:
    img.onload = function() {
    ctx.drawImage(img,10,10);
    ctx.drawImage(img,260,10,100,100);
    ctx.drawImage(img,50,50,100,100,260,130,100,100);
    }
  • 利用 getImageData 和putImageData 绘制图片:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    var img = new Image();
    img.src = "face.jpg";
    img.onload = function() {
    //利用 drawImage 函数在canvas 上绘制图片。
    ctx.drawImage(img,10,10);
    ///利用 getImageData 函数获取canvas 上的图片数据,四个参数分别为:起始位
    置所谓坐标值 X、Y ,选择区域的长宽。(注意如果 canvas 区域中无绘制图片则
    取得空白)
    var imgData = ctx.getImageData(50,50,200,200); //获取的是已经绘制在 canvas 上的图
    //利用函数 putImageData 将得到的像素数据绘制到画板上。七个参数分别是:
    像素数据、绘制图片的起始坐标 X、Y ,获取图片的起始位置X、Y,获取图片
    的长宽。(如果后面四个参数省略,则获取整个图片)
    ctx.putImageData(imgData,10,260);
    ctx.putImageData(imgData,200,260,50,50,100,100); //注意这里相差的四个参数
    };
    //在使用如 getImageData 这个函数时,为了阻止欺骗,浏览器会追踪 image data。
    当你把一个 “跟 canvas 的域不同的 ”图片放到 canvas 上,这个canvas 就成为
    “tainted”(被污染的,脏的 ),浏览器就不让你操作该 canvas 的任何像素。这对
    于阻止多种类型的 XSS/CSRF 攻击(两种典型的跨站攻击)。我在进行一个本地
    的html 网页,操作本地的一张图片时 chrome 浏览器也报错,可能是因为本地
    网页的域为 file://,而本地图片肯定不是以 file://开头的,如windows 环境下的某
    个图片为 : c:\tmp\test.png。(在测试 firbox 时没有问题) 
  • 利用 createImageData 新建像素:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //createImageData(a,b) // 创建a*b 像素(长宽)的 imagaData 对象,不修改像素
    的话为白色,
    //代码
    img.onload = function() {
    var imageData = ctx.createImageData(100,100);
    for(var i =0;i<imageData.data.length;i+=4) { //像素设置
    imageData.data[i+0] = 255; //为红色
    imageData.data[i+1] = 0;
    imageData.data[i+2] = 0;
    imageData.data[i+3] = 255;
    }
    ctx.putImageData(imageData,0,0);
    }
    //也可以这样设置
    var imgData = ctx.getImageData(50,50,200,200);
    var imageData = ctx.createImageData(imgData);// 得到的只是像素大小 

变形:

  • scale 函数:放大、缩小、翻转://利用 scale 函数实现图片的放大、缩小,两个参数分别对应 X、Y 轴坐标的放

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ctx.scale(3,3); //放在要绘画的图片的前面
    ctx.beginPath();
    strokeStyle = "#ccc";
    //绘制了一个矩形,由于 scale 函数,实际绘制的矩形坐标为 (30,30,450,300).
    ctx.strokeRect(10,10,150,100);
    //利用 scale 函数实现图片的缩小。
    ctx.scale(0.5,0.5);
    //注意使用scale 之后对接下来所有绘制的图片都有效;恢复的方法:如使用
    scale(2,2)之后,在想恢复的地方使用scale(0.5,0.5).;或者直接将scale 放在一个
    js 函数里调用。
     
    var img = new Image();
    img.src = "face.jpg";
    img.onload = function() {
    ctx.drawImage(img,10,10);
    //将函数 scaleY 轴参数设为负值,同时将 drawImage 函数的起始点 Y 轴设为负
    值,使图片翻转。
    ctx.scale(1,-1);
    ctx.drawImage(img,250,-250); //此时注意翻转后图片最上面的点为原图片最下
    面的点
    };

    //步骤总结:1.使用scale(1-1)将图片以canvas 最上边对称映射2.在设置图片位置时相对原来要设置的位置,y 轴取相应的负值(这里如果想象成坐标轴区域的话,也可以使用translate 进行平移,不过注意移动的符号)。同理可以实现左右翻转。 //scale 翻转后的恢复步骤同样;如果像上面一样在一个函数内调用则无需。

  • translate://利用 translate 函数进行平移,两个参数分别是 X、Y 轴上平移的距离。//注意此函数移动的是 canvas 的坐标原点。
    1
    2
    3
    4
    5
    6
    7
    ctx.translate(50,100);
    ctx.beginPath();
    ctx.strokeStyle = "#000";
    //绘制的矩形平移后的坐标为( 60,100 ,150, 100)相当于平移起始点坐标
    ctx.strokeRect(10,10,150,100);
    //与scale 一样的恢复步骤。
    //结合使用translate 与scale 也可以将绘制的图形进行翻转;<em id="__mceDel" style="line-height: 1.5; font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; ">  </em>
  • rotate:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ctx.beginPath();
    ctx.strokeStyle = "#000";
    ctx.strokeRect(200,50,100,50);
    //利用 rotate 函数,参数为旋转的弧度。(默认以( 0,0 )为中心进行顺时针旋
    转)
    ctx.rotate(45*Math.PI/180);
    ctx.beginPath();
    ctx.strokeStyle = "#f00";
    ctx.strokeRect(200,50,100,50);

      

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    以自己为中心进行旋转
    ctx.beginPath();
    ctx.strokeStyle = "#000";
    ctx.strokeRect(200,50,100,50);
    //先用 translate 函数将canvas 的起始坐标移到矩形中心处
    ctx.translate(250,75);
    //再用 rotate 函数使图像绕起始点(矩形中心点)旋转
    ctx.rotate(45*Math.PI/180);
    //最后用 translate 函数将canvas 的起始坐标移回(0,0)
    ctx.translate(-250,-75);
     
    ctx.beginPath();
    ctx.strokeStyle = "#f00";
    ctx.strokeRect(200,50,100,50);

      

 //总结:一些如颜色设置,大小、位置变化等都是作用与全局的,所以使用save与restore;图形的绘制最后的呈现结果可以理解为先绘制好这个图形,在根据顺序经历之前定义的变化,最后呈现结果。

canvas使用2的更多相关文章

  1. html5 canvas常用api总结(三)--图像变换API

    canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...

  2. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  3. 简单入门canvas - 通过刮奖效果来学习

    一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...

  4. 获取Canvas当前坐标系矩阵

    前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操作之后,怎么再知道当前矩阵数据状态呢. 具体代码 首先请看下面的一 ...

  5. Canvas坐标系转换

    默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为x=0,y=0的点称作原点.在默认坐标系中,每一个点的坐标都是直接 ...

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

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

  7. 用html5的canvas和JavaScript创建一个绘图程序

    本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...

  8. html5标签canvas函数drawImage使用方法

    html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本.参数传递三种形式: drawImage(image,x,y):在 ...

  9. 使用 JavaScript 和 canvas 做精确的像素碰撞检测

    原文地址:Pixel accurate collision detection with Javascript and Canvas 译者:nzbin 我正在开发一个需要再次使用碰撞检测的游戏.我通常 ...

  10. H5项目开发分享——用Canvas合成文字

    以前曾用Canvas合成.裁剪.图片等<用H5中的Canvas等技术制作海报>.这次用Canvas来画文字. 下图中"老王考到驾照后"这几个字是画在Canvas上的,与 ...

随机推荐

  1. su: cannot set user id: Resource temporarily unavailable【转】

    今天R&D所在主机出现su: cannot set user id: Resource temporarily unavailable资源不可用报错,直接通过其他机器ssh huyuh@xxx ...

  2. Shell脚本实现非法IP登陆自动报警【转】

    服务器的安全稳定是每个运维都希望达到的目标,毕竟网站一旦流量大了,访问高了,就会有一些无聊人来攻击,帮忙检测漏洞是好,但纯ddos的性质就很恶劣了.说远了,这篇文章只是检测有非法ip登录到服务器上就自 ...

  3. Linux学习笔记:sed删除、插入数据

    一.sed删除文件第一行 sed -i '1d' file.txt -- 删除第一行 sed -i 'nd' file.txt -- 删除第n行 sed -i '$d' file.txt -- 删除最 ...

  4. prometheus如何使用blackbox-exporter来获取k8s的网络性能

    如果学会了如何抓取app的metrics,则blackbox-exporter抓取网络性能套路是相同的. 一,在blackbox-exporter的blackbox.yml里配置好抓取模块,常见的是h ...

  5. 在浏览器输入网址,Enter之后发生了什么?

    启动浏览器,在地址栏输入我们将要访问的网页,然后按一下回车,OK,成功进入! 在我们回车之后,发生了什么事情?为什么我们会访问到期待的网页,我们究竟访问了谁?如何访问到他的? 我简单的向大家介绍一下, ...

  6. 【LOJ】#2183. 「SDOI2015」序列统计

    题解 这个乘积比较麻烦,转换成原根的指数乘法就相当于指数加和了,可以NTT优化 注意判掉0 代码 #include <bits/stdc++.h> #define fi first #de ...

  7. 如何对手机使用adb

    因为要配合前端做测试,所以我需要在本机中安装adb驱动,以便可以连接手机进行各种操作. 好吧...装adb驱动这块当时我没有把流程给做记录...郁闷,下次再安装的时候再谷歌吧. 使用的简单脚本就是 有 ...

  8. spring-boot集成Springfox-Swagger2

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Co ...

  9. SpringBoot详细研究-01基础

    Springboot可以说是当前最火的java框架了,非常适合于"微服务"思路的开发,大幅缩短软件开发周期. 概念 过去Spring充满了配置bean的xml文件,随着spring ...

  10. Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

    如何学会在合适的场景使用合适的技术方案,这值得思考. 由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基 ...