<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body>    <canvas id="canvas" width="600" height="800" style="background-color: rgb(38, 139, 139); margin:20px">            </canvas>    <script>        /** @type {HTMLCanvasElement} */        let cDom=document.getElementById('canvas')        let context=cDom.getContext('2d')// 第一局部        // 绘制线条        // context.moveTo(10,20)        // context.lineTo(70,30)        // context.lineWidth=12        // context.strokeStyle="red"        // context.stroke()        // context.moveTo(50,80)        // context.lineTo(50,120)        // context.lineWidth=7        // context.strokeStyle='pink'        // context.stroke()        //第二个图案,        // context.beginPath()        // context.moveTo(10,120)        // context.lineTo(100,120)  //新建门路API        // context.lineWidth=5        // context.strokeStyle='black'        // context.stroke()        // 三角形,        // context.beginPath()        // context.moveTo(10,150)        // context.lineTo(120,150)        // context.lineTo(60,180)        // context.closePath()   //线路闭合API        // context.fillStyle='green' //填充色彩        // context.fill() //填充        // context.lineWidth=3        // context.strokeStyle='pink'        // context.stroke()        // 矩形        // context.beginPath()        // context.rect(20,180,40,50)        // context.lineWidth=1        // context.strokeStyle='red'        // context.stroke()        // 空心矩形组合API        // context.beginPath()        // context.lineWidth=2        // context.strokeStyle="pink"        // context.strokeRect(20, 240, 40, 50);        // 实心矩形组合API        // context.beginPath()        // context.fillStyle="blue"        // context.fillRect(30,200,40,50);        // 第二局部弧线        //actTo 弧线原理: 三个控制点,x1,x2,x3,同时内切于 x1-x2 和 x2-x3 两条直线的内切圆        // context.beginPath();        // context.moveTo(200, 10);        // context.arcTo(200, 100, 100, 10, 48);        // context.lineWidth=3;        // context.strokeStyle='pink';        // context.stroke();                // 辅助线        // context.beginPath();        // context.moveTo(200, 10);        // context.lineTo(200, 100);        // context.lineTo(100, 10);        // context.closePath();        // context.lineWidth=1;        // context.strokeStyle='red';        // context.stroke();                // arc画弧原理:确定圆心,半径,起始角度,终止角度,方向        // context.beginPath();        // context.arc(100, 200, 30, 0, Math.PI/3, false);        // context.stroke();        // 二阶贝塞尔曲线:终点,起点,控制点        // context.beginPath();        // context.moveTo(130, 250);        // context.quadraticCurveTo(130, 280, 160, 265);        // context.stroke();        //3 绘图款式        // context.beginPath();        // context.moveTo(10, 20);        // context.lineTo(200, 300);        // context.lineWidth=5;        // 默认值        // context.lineCap='butt';        // 圆角        // context.lineCap='round';        // 矩形        // context.lineCap='square';        // 虚线        // context.setLineDash([7,10,15,20,30]);                // context.stroke();        // 线性突变        // context.beginPath();        // x1,y1,x2,y2        // let gradient= context.createLinearGradient(50,150,100,290)        // gradient.addColorStop(0, 'pink');        // gradient.addColorStop(0.7, 'red');        // gradient.addColorStop(1, 'pink');        // context.fillStyle=gradient;        // context.fillRect(25,150,200,150);        // 径向突变        // context.beginPath();        // 圆心一,半径一,圆心二,半径二        // let gradient2=context.createRadialGradient(190, 440, 5, 140, 450, 80);        // gradient2.addColorStop(0,'green')        // gradient2.addColorStop(0.2,'pink')        // gradient2.addColorStop(0.4,'green')        // gradient2.addColorStop(0.6,'pink')        // gradient2.addColorStop(0.8,'green')        // gradient2.addColorStop(1,'pink')        // context.fillStyle=gradient2;        // context.fillRect(40,350,200,200);                // 纹理款式 填充图片        // context.beginPath();        // let img1=new Image();        // img1.src='./mao.gif'        // img1.onload=function(){        //     let pattern=context.createPattern(img1, 'repeat');        //     context.fillStyle=pattern;        //     context.fillRect(30,600,200,120);                    // }                // 绘制文本        // context.beginPath();        // 字体款式        // context.font='200px Times New Roman';        // 暗影右偏移        // context.shadowOffsetX=2;        // 暗影下偏移        // context.shadowOffsetY=6;        // 暗影含糊度        // context.shadowBlur=6;        // 暗影色彩        // context.shadowColor='red';            // 填充文本        // context.fillText(text, x, y, maxWidth);        // 轮廓文本        // context.strokeText('hello', 150, 150);        // 纹理填充        // let img=new Image();        // img.src='./mao.gif'        // img.onload=function(){        //     let pattern=context.createPattern(img, 'repeat');        //     context.fillStyle=pattern;        //     context.fillText('hello', 150, 300);        // }        // 绘制图片              // context.beginPath();        // let img=new Image()        // img.src="./tuzi.png"                // img.onload=function(){            // 图片,x,y,宽,高,            // context.drawImage(img, 10, 20,100,100);            // 从图片上扣取某局部放到画布上:图片,图片里的x,图片的y,剪裁的宽度,剪裁的高度,画布的x,画布的y,搁置的宽度,搁置的高度            // context.drawImage(img, 100, 500,100,100,100,500,100,100);        // }        // 进阶             // 变形 平移:translate,选装:rotate,缩放;scale        // 平移        // context.beginPath();        // context.fillStyle='red';        // 状态保留:坐标,色彩        // context.save();        // context.fillRect(0,0,100,100);        // context.translate(400, 400);        // context.fillRect(0,0,100,100);        //复原之前的状态,当然也能够 context.translate(-400 -400);        // context.restore();        // context.fillStyle='black';        // context.fillRect(0,0,50,50);                // 选装        // context.beginPath();        // context.fillStyle='yellow';        // context.save();        // context.rotate( 30 * Math.PI / 180);        // context.fillRect(100,100,40,40);        // context.restore();        // context.fillRect(100,100,40,40);        // 缩放        // context.beginPath();        // context.fillStyle='blue';        // context.save();        // context.scale(1.5, 2);        // context.fillRect(200,200,50,50);        // context.restore();        // context.fillRect(200,200,50,50);                        // transform 线性代数矩阵变换        // a   c   e        // b   d   f        // 0   0   1        // a 程度缩放 1        // b 程度歪斜 0        // c 垂直歪斜 0        // d 垂直缩放 1        // e 程度位移 0        // f 垂直位移 0        // context.beginPath();        // context.save();        // context.transform(1, 0, 0, 1, 100, 200);        // context.fillStyle='pink';        // context.fillRect(0,0,100,100);                // 合成: 共提供了26中混排模式,用的时候现查就能够了。        // 后绘制的放到上面 destination-over        // 后绘制的镂空先绘制的 destination-out        // context.globalCompositeOperation='destination-over';        // context.fillStyle='blue';        // context.fillRect(100,100,200,200);        //     context.fillStyle='red';        // context.fillRect(200,200,200,200 );        // 裁剪        // context.lineWidth='1px';        // context.rect(0, 0, 150, 150);        // context.stroke();        // context.clip();  //只在上方的闭合曲线内显示         // context.fillStyle='blue';        // context.font='44px sans-serif';        // context.fillText('hello', 100, 100);                    </script></body></html>