依木食品商场 發表於 2019-5-21 16:29:00

html5 canvas 自定义画图裁剪图片

<p>html5 给我们带来了极大惊喜的canvas标签,有了它我们可以在浏览器客户端处理图片,不需要经过服务器周转。可以实现:</p>
<p>&nbsp;</p>
<p>1、照片本地处理,ps有的一些基本功能都有</p>
<p>2、结合js可以实现一些很炫的动画效果</p>
<p>&nbsp;</p>
<p>这篇文章实现一个微信上发图片消息的效果最终效果图:</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/115923/201905/115923-20190521163236733-175153616.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>下面我们先介绍canvas一些基本的用法,这里可能需要一些基本的几何知识,对小伙伴们来说应该不是问题</p>
<p>1、创建一个canvas</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var canvas=document.createElement('canvas');或者获取一个已存在的canvas,var canvas=document.getElementById('canvasid');</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; canvas.width=1000;canvas.height=1000;//定义大小</p>
<p>2、创建绘图的上下文</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var context=canvas.getContext('2d');</p>
<p>3、画直线</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beiginPath();//开始画图</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(100,50) ;//这个方法类似于我们写字时提笔动作,即把笔提起来,放到指定坐标处</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(100,100);//由(100,50)处画到(100,100)处</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lienWidth=2;//定义笔的粗细</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle='red';//定义笔的颜色</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.stroke();//以指定的粗细和颜色描绘路径。前面的只是有了路径,必须用stroke方法进行描绘,否则看不到任何效果</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/115923/201905/115923-20190521163317119-58782521.png" alt=""></p>
<p>&nbsp;</p>
<p>4、画实心三角形</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(100,110);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(100,210);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; context.lienTo(150,210);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; //context.lineTo(100,110);//这句要不要都无所谓,因为后面的fill方法自动会将路径闭合</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle=‘green’;//填充颜色</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; context.fill();//开始填充&nbsp;</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/115923/201905/115923-20190521163326847-1887728060.png" alt=""></p>
<p>&nbsp;</p>
<p>5、画空心三角形(直线加斜线组合)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beiginPath();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(100,220);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(100,320);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(150,320);</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp; context.closePath();//关闭路径 ,用context.lineTo(100,220)继续画完也可以</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=3;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.stroke();</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/115923/201905/115923-20190521163339903-40902387.png" alt=""></p>
<p>&nbsp;</p>
<p>6、画正方形(直线加斜线组合)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(100,330);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineJoin='round';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(100,430);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(200,430);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(200,330);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.closePath();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle='blue';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.stroke();</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/115923/201905/115923-20190521163349585-1433454683.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 眼尖的小伙伴们应该注意到了,四个拐角是圆的,对的,就是context.lineJoin='round'的功劳,除了round还有bevel(斜角)和miter(尖角),默认miter</p>
<p>7、画圆</p>
<p>&nbsp; &nbsp; &nbsp; context.beginPath(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.arc(150500,50,0,2*Math.PI);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle='orange';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.stroke();&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="https://img2018.cnblogs.com/blog/115923/201905/115923-20190521163402256-1705359137.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>8、画曲线</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();<br>&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(100,600);<br>&nbsp;&nbsp;&nbsp;&nbsp; context.quadraticCurveTo(150,650,100,700);//(150,600)为控制点,(100,700)为曲线终点。可以指定多个控制点,能更精确的控制曲线的走向<br>&nbsp;&nbsp; &nbsp; context.stroke();<br>&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<img src="https://img2018.cnblogs.com/blog/115923/201905/115923-20190521163411032-951225154.png" alt=""></p>
<p>&nbsp;</p>
<p>9、裁剪</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //加载图片</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp; var image=new Image();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image.src='../images/Penguins.jpg';</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; image.onload=function(){</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp; context.beginPath();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //画裁剪区域,此处以圆为例</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.arc(50,50,50,0,2*Math.PI);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.clip();//次方法下面的部分为待剪切区域,上面的部分为剪切区域</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.drawImage(image,0,0,100,100);</p>
<p>}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="https://img2018.cnblogs.com/blog/115923/201905/115923-20190521163439922-562700909.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>注意:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、stroke()方法比较耗性能,如果描绘的样式一样的话建议放在最后执行</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、用slip方法画裁剪区域过程中不能出现moveTo提笔的操作,否则无法形成完整的区域,剪切的效果大家可以试试。</p>
<p><br>看完以上例子是不是对我们最终要实现的效果有清晰的思路了。</p>
<p>4条直接+4个圆角+2条斜线就可实现。直线和斜线好画,关键在于圆角,有人说直接用lineJoin不就搞定了吗,大家要清楚,lineJoin画出来的圆角角度大小是根据lineWidth确定的,要达到我们要实现的圆角角度,上面画正方形的圆角lineWidth=10,可我们的图片边框要这么粗?显然不符合要求,且难以控制圆角角度。最佳的办法就是用quadraticCurveTo画曲线替换,关键在于确定曲线的三个点:起点,控制点和终点,下面是完整的代码:</p>
<p>&nbsp;</p>
<p>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br>&lt;head lang="en"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;meta charset="UTF-8"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;title&gt;&lt;/title&gt;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;window.onload=function(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var image=new Image();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image.src='../images/Penguins.jpg'; &nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image.onload=function(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var canvas=document.createElement('canvas');</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; canvas.width=106;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; canvas.height=100;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context=canvas.getContext('2d');</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(0, 6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(0, 100-6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.quadraticCurveTo(0, 100, 6, 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(100-6, 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.quadraticCurveTo(100, 100, 100, 100-6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; context.lineTo(100,27);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; context.lineTo(100+5,22);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; context.lineTo(100,17);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(100, 6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.quadraticCurveTo(100, 0, 100-6, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(6, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.quadraticCurveTo(0, 0, 0, 6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=0.5;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.stroke();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.clip();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.drawImage(image,0,0,106,100);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.body.appendChild(canvas);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}<br>&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br>&lt;/head&gt;<br>&lt;body style="margin:0px;padding:0px;"&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;最终效果图:</p>
<p><img src="https://img2018.cnblogs.com/blog/115923/201905/115923-20190521163455823-622059695.png" alt=""></p>
<p>&nbsp;</p>
<p><br>当初为实现这个效果,因为刚接触canvas,找了很多资料,网上很多都是介绍规则图形裁剪例子,没有不规则的,最终实现时,万分激动啊,终于可以在聊天发图片时有微信上的的感觉。<br><br></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/porter/p/10900597.html
頁: [1]
查看完整版本: html5 canvas 自定义画图裁剪图片