应用HTML5 Canvas API中的clip()方式剪裁地区图象

日期:2021-01-20 类型:科技新闻 

关键词:商城网站建设,微商好助手,微商引流,电商网站模板,微信商家小程序

应用Canvas绘图图象的情况下,大家常常会要想只保存图象的1一部分,这是大家可使用canvas API再带的图象剪裁作用来完成这1念头。
Canvas API的图象剪裁作用是指,在画布内应用相对路径,只绘图该相对路径内所包括地区的图象,不容易只相对路径外的图象。这有点像Flash中的涂层遮罩。

应用图型左右文的不带主要参数的clip()方式来完成Canvas的图象剪裁作用。该方式应用相对路径来对Canvas话不设定1个剪裁地区。因而,务必先建立好相对路径。建立详细后,启用clip()方式来设定剪裁地区。
必须留意的是剪裁是对画布开展的,裁剪后的画布不可以修复到原先的尺寸,也便是说画布是越切越小的,要想确保最终依然能在canvas最开始界定的尺寸下制图必须留意save()和restore()。画布是先裁剪完了再开展制图。其实不1定非如果照片,相对路径还可以放进去~

先看来看1个简易的Demo。

JavaScript Code拷贝內容到剪贴板
  1. <!DOCTYPE html>   
  2. <html lang="zh">   
  3. <head>   
  4.     <meta charset="UTF⑻">   
  5.     <title>剪裁地区</title>   
  6.     <style>   
  7.         body { background: url("./images/bg3.jpg") repeat; }  
  8.         #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }   
  9.     </style>   
  10. </head>   
  11. <body>   
  12. <div id="canvas-warp">   
  13.     <canvas id="canvas">   
  14.         你的访问器竟然不适用Canvas?!赶紧换1个吧!!   
  15.     </canvas>   
  16. </div>   
  17.   
  18. <script>   
  19.     window.onload = function(){   
  20.         var canvas = document.getElementById("canvas");   
  21.         canvas.width = 800;   
  22.         canvas.height = 600;   
  23.         var context = canvas.getContext("2d");   
  24.         context.fillStyle = "#FFF";   
  25.         context.fillRect(0,0,800,600);   
  26.   
  27.         //在显示屏上绘图1个大气块   
  28.         context.fillStyle = "black";   
  29.         context.fillRect(10,10,200,200);   
  30.         context.save();   
  31.         context.beginPath();   
  32.   
  33.         //剪裁画布从(0,0)点至(50,50)的正方形   
  34.         context.rect(0,0,50,50);   
  35.         context.clip();   
  36.   
  37.         //鲜红色圆   
  38.         context.beginPath();   
  39.         context.strokeStyle = "red";   
  40.         context.lineWidth = 5;   
  41.         context.arc(100,100,100,0,Math.PI * 2,false);   
  42.         //整圆   
  43.         context.stroke();   
  44.         context.closePath();   
  45.   
  46.         context.restore();   
  47.   
  48.         //再度裁剪全部画布   
  49.         context.beginPath();   
  50.         context.rect(0,0,500,500);   
  51.         context.clip();   
  52.   
  53.         //绘图1个沒有裁剪的蓝线   
  54.         context.beginPath();   
  55.         context.strokeStyle = "blue";   
  56.         context.lineWidth = 5;   
  57.         context.arc(100,100,50,0,Math.PI * 2,false);   
  58.         //整圆   
  59.         context.stroke();   
  60.         context.closePath();   
  61.     };   
  62. </script>   
  63. </body>   
  64. </html>  

运作結果:

混和应用save()和restore()方式,大家能够限制画画地区。最先大家可使用rect()方式包围着1个大家期待画画的地区,随后应用clip()方式把该地区剪裁下来。

这样之后大家无论在context中做了甚么实际操作,仅有限制的一部分显示信息出来。也便是说clip()的功效是限制要显示信息的地区。当大家不期待再次限制地区了,可使用restore()方式跳出来来,再次实际操作原先的context。
再看来这样1个剪裁:

JavaScript Code拷贝內容到剪贴板
  1. function drawScreen() {   
  2.         var x = canvas.width / 2;   
  3.         var y = canvas.height / 2;   
  4.         var radius = 75;   
  5.         var offset = 50;   
  6.   
  7.         //剪裁的地区为 (x, y)为管理中心半径为75的圆   
  8.         context.save();   
  9.         context.beginPath();   
  10.         context.arc(x, y, radius, 0, 2 * Math.PI, false);   
  11.         context.clip();   
  12.   
  13.         // 先画1个蓝色的圆弧, 超出剪裁的一部分无法显示   
  14.         context.beginPath();   
  15.         context.arc(x - offset, y - offset, radius, 0, 2 * Math.PI, false);   
  16.         context.fillStyle = 'blue';   
  17.         context.fill();   
  18.   
  19.         // 画1个黄色的圆弧, 超出剪裁的一部分无法显示   
  20.         context.beginPath();   
  21.         context.arc(x + offset, y, radius, 0, 2 * Math.PI, false);   
  22.         context.fillStyle = 'yellow';   
  23.         context.fill();   
  24.   
  25.         // 画1个鲜红色的圆弧, 超出剪裁的一部分无法显示   
  26.         context.beginPath();   
  27.         context.arc(x, y + offset, radius, 0, 2 * Math.PI, false);   
  28.         context.fillStyle = 'red';   
  29.         context.fill();   
  30.   
  31.         /*  
  32.          * restore()方式会回到到context本来的情况,在这里是clip()以前的情况。  
  33.          * 大伙儿能够移除context.beginPath()方式,试试会产生甚么。  
  34.          */  
  35.         context.restore();   
  36.         context.beginPath();   
  37.         context.arc(x, y, radius, 0, 2 * Math.PI, false);   
  38.         context.lineWidth = 10;   
  39.         context.strokeStyle = 'blue';   
  40.         context.stroke();   
  41.     }  

   
再度强调,1般应用剪裁作用的启用方式是

save();
clip();
restore();
这个次序来开展启用。