裁剪区域

Canvas中的剪辑区域,是由路径所定义的一块区域,浏览器会把所有的绘图操作都限制在该区域内执行。

Canvas中,使用clip()方法来设定剪辑区域,一旦设定好裁剪区域,则只有落在裁剪区域内的图形才能绘制出来,在裁剪区域以外进行绘制将没有任何效果。默认的剪辑区域是整个画布。

由于剪辑区域是由路径所定义的区域,所以,必须先调用beginPath()方法绘制一个路径,然后,才能通过clip()方法把该路径设置为裁剪区域。定义裁剪区域的步骤为:

  1. 调用beginPath()方法开始一个路径。
  2. 调用arc()、rect()等方法定义路径。
  3. 调用clip()方法,把该路径设置为裁剪区域。

下面以绘制两个圆形区域为例,来说明裁剪区域的使用方法。首先,不设置裁剪区域,绘制两个圆形区域:

  1. context.lineWidth = 12;
  2. context.strokeStyle = "#444";
  3. context.beginPath();
  4. context.arc(100, 100, 50, 0, Math.PI*2);
  5. context.closePath();
  6. context.stroke();
  7. context.beginPath();
  8. context.arc(100, 100, 30, 0, Math.PI*2);
  9. context.closePath();
  10. context.stroke();

由于未设置裁剪区域,两个圆都被完整的绘制出来,运行结果如图 4‑25 所示:

图4-25 未设置裁剪区域

调用rect()方法,在画布的左上角定义一个100×100的矩形路径,再调用clip()方法把该路径设置为裁剪区域。

  1. context.lineWidth = 12;
  2. context.strokeStyle = "#444";
  3. context.rect(0,0,100,100);  // 定义裁剪区域
  4. context.clip();
  5. context.beginPath();
  6. context.arc(100, 100, 50, 0, Math.PI*2);
  7. context.closePath();
  8. context.stroke();
  9. context.beginPath();
  10. context.arc(100, 100, 30, 0, Math.PI*2);
  11. context.closePath();
  12. context.stroke();

上述代码设置了一个矩形的裁剪区域,所以,只有落在该裁剪区域内的部分被绘制出来。运行效果如图 4‑26 所示:

图4-26 设置一个裁剪区域

从上图可以看出,两个圆均只绘制出其左上角部分,其余部分没有被绘制。

当然,也可以设置多个裁剪区域。如果要定义多个裁剪区域,只需要在该路径中定义多条路径,再调用clip()方法把它们设置为裁剪区域即可。

  1. context.lineWidth = 12;
  2. context.strokeStyle = "#444";
  3. context.rect(0,0,100,100);      // 定义第一个裁剪区域
  4. context.rect(100,100,100,100);  // 定义第二个裁剪区域
  5. context.clip();
  6. context.beginPath();
  7. context.arc(100, 100, 50, 0, Math.PI*2);
  8. context.closePath();
  9. context.stroke();
  10. context.beginPath();
  11. context.arc(100, 100, 30, 0, Math.PI*2);
  12. context.closePath();
  13. context.stroke();

上述代码在原来的基础上,又增加了右下侧的裁剪区域。由于现在有两个矩形的裁剪区域,此时,左上角和右下角的圆弧都被绘制出来。运行结果如图 4‑27 所示:

图4-27 设置两个裁剪区域

当使用裁选区进行绘画后,有时需要取消该裁选区或重新定义裁选区。此时,可以在需要保存状态的地方调用save()方法,在需要恢复状态的地方调用restore()方法。

  1. context.lineWidth = 12;
  2. context.strokeStyle = "#444";
  3. context.save();     // 保存状态
  4. context.rect(0,0,100,100);
  5. context.clip();
  6. context.beginPath();
  7. context.arc(100, 100, 60, 0, Math.PI*2);
  8. context.closePath();
  9. context.stroke();
  10. context.restore();  // 恢复状态
  11. context.beginPath();
  12. context.arc(100, 100, 40, 0, Math.PI*2);
  13. context.closePath();
  14. context.stroke();

上述代码中,第一个圆被局限在裁选区域内。由于在绘制第二个圆之前,调用了restore()方法恢复状态,取消了裁选区域,因此第二个圆是完整的。运行结果如图 4‑28 所示:

图4-28 取消裁剪区域

关于作者

歪脖先生,十五年以上软件开发经验,酷爱Web开发,精通 HTML、CSS、JavaScript、jQuery、JSON、Python、Less、Bootstrap等,著有《HTML宝典》、《揭秘CSS》、《Less简明教程》、《JSON教程》、《Bootstrap2用户指南》,并全部在 GitHub 上开源。

版权声明:本文出自 歪脖网 的《HTML宝典》,欢迎在线阅读,并提出宝贵意见。

HTML5 Canvas 裁剪区域相关推荐

  1. html5 canvas裁剪图片,html5-canvas 使用画布裁剪图像

    示例 本示例显示了一个简单的图像裁剪功能,该功能获取图像和裁剪坐标并返回裁剪后的图像. function cropImage(image, croppingCoords) { var cc = cro ...

  2. html5在线裁剪,HTML5 Canvas裁剪clip

    裁剪(即clip())是渲染上下文中的绘制方法之一.很多人都以为这是一个清除概念,其实是错的.虽然从表现上看像清除,但是由于剪切区域由绘图路径设定,因此这是一个独立的显示区域. 在Canvas动画中, ...

  3. html5在线裁剪,html5 Canvas裁剪图片

    drawImage(图片,图片中裁减的起始x坐标,图片中裁减的起始y坐标,裁减区域宽度,裁减区域高度,所画位置x坐标,所画位置y坐标,所画图形宽度,所画图形高度) 首先来看如下效果: 代码如下: va ...

  4. 如何使用HTML5 Canvas元素来裁剪图像

    本文介绍如何使用JavaScript和HTML5 Canvas元素来移动.调整大小和裁剪图像,这些技术适用于图片编辑器.照片分享等应用场景.借助HTML5 Canvas绘图功能,可以在浏览器端以比较简 ...

  5. html5 canvas 自定义画图裁剪图片

    html5 给我们带来了极大惊喜的canvas标签,有了它我们可以在浏览器客户端处理图片,不需要经过服务器周转.可以实现: 1.照片本地处理,ps有的一些基本功能都有 2.结合js可以实现一些很炫的动 ...

  6. php画布怎么清除,JavaScript_JavaScript html5 canvas画布中删除一个块区域的方法,本文实例讲述了html5 canvas画布 - phpStudy...

    JavaScript html5 canvas画布中删除一个块区域的方法 本文实例讲述了html5 canvas画布中删除一个块区域的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 附:图 ...

  7. HTML5 Canvas

    HTML5 Canvas 转自:https://blog.csdn.net/u012468376/article/details/73350998 一.canvas简介 ​  <canvas&g ...

  8. 使用 HTML5 canvas 进行 Web 绘图

    新的 HTML5 规范旨在帮助开发人员更轻松的编写出各类 Web 应用,以顺应当前 SaaS,云计算以及 RIA 等技术的最新趋势.在 HTML5 得以广泛推广之前,开发人员通常使用 SVG,VML ...

  9. html5canvas绘制图片源码,HTML5 CANVAS:绘制图片

    HTML5 CANVAS:绘制图片 通过前面的学习,我们现在已经可以在HTML5 canvas中绘制图形和文字,并给它们设置一些样式.我们还可以在中绘制图片.用于在作为绘制源的图片可以是下面的几种元素 ...

最新文章

  1. 如何使用TensorRT对训练好的PyTorch模型进行加速?
  2. R语言基于多字段(多数据列、multiple columns)对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案
  3. 学习小米附加和大润发飞牛模式
  4. go python php 压力测试_pyLot 基于python的压力测试工具
  5. 光标定位在文本框的末尾
  6. Ubuntu 中sendmail 的安装、配置与发送邮件的具体实现
  7. 44膜型键盘_小学四年级数学上册考试必考题型:判断题练习题
  8. Calendar中add()和roll()函数的用法
  9. CC2530单片机开发--串口
  10. Unity3D开发体验
  11. vue echarts饼状图内部显示百分比
  12. 研报复现系列(六)【国泰君安】基于CCK模型的股票市场羊群效应研究
  13. C++面向对象程序设计(侯捷)笔记
  14. linux怎么进sda12,VMare12.0.1安装Ubuntu16.04.2遇到[sda] Assuming drive cache
  15. 【太虚AR_v0.1】使用教程 | 视频播放
  16. ADC系列---噪声与误差(TI视频)
  17. 互联网日报 | QQ正式上线QID功能;高通骁龙888处理器正式发布;嫦娥五号成功落月...
  18. 771. 宝石与石头
  19. Java_运动员和教练案例代码实现
  20. Java中先按照姓名排序(姓名相同)在按照年龄排序(年龄相同)按照编号 排序呢 策略模式

热门文章

  1. 国产IT彪起来了,后浪要将前浪拍死在沙滩上
  2. Gridview 单选效果实现,且用且珍惜
  3. Smarty 入手学习教程
  4. 浏览器屏蔽flash视频广告
  5. JVM虚拟机-Class文件之访问标志
  6. C++根据系统时间生成不重复的随机数
  7. [洛谷P1369]矩形
  8. 马哥学习李洋个人笔记之-----正则表达式
  9. Oracle数据库日常管理之数据备份,恢复及迁移 (第五讲 )
  10. 3月8日云栖精选夜读:《云栖精选阿里巴巴技术实战2016年刊》重磅发布