原生js基于canvas实现一个简单的前端截图工具代码实例


Posted in Javascript onSeptember 10, 2019

这篇文章主要介绍了原生js基于canvas实现一个简单的前端截图工具代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

先看效果

原生js基于canvas实现一个简单的前端截图工具代码实例

代码如下

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
      *{
        padding: 0;
        margin: 0;
      }
      .clip-img-w{
        position: relative;
        width: 100%;
        height: 100%;
        font-size: 0;
      }
      .clip-img-w img{
        max-width: 100%;
        max-height: 100%;
        position: absolute;
        left: 0;
        top: 0;
        right: 0;
        bottom: 0;
        margin: auto;
      }
      .clip-img-w canvas{
        position: absolute;
        left: 0;
        top: 0;
      }
      .clip-img-w #clipcanvas{
        z-index: 2;
      }
      .clip-img-w #drawcanvas{
        background: #fff;
        z-index: 1;
      }       
      #img{
        display: block;
        margin: 0 auto;
      }
      .box-c{
        width: 400px;
        height: 200px;
        border: 1px solid #F35252;
        margin: 20px auto;
      }
    </style>
  </head>
  <body>
    <div class="box-c">
      <div class="clip-img-w" id="clip-img-w">
        <canvas id="drawcanvas" ></canvas>
        <canvas id="clipcanvas" ></canvas>
      </div>
    </div>
     
    <!-- 结果 -->
    <img src="" id="img">
  </body>
  <script type="text/javascript">
    var img = document.getElementById("img");
    var url = 'http://img.muchengfeng.cn/FvC7i-GkXYoHE7kGFlNfj7xEzvIQ';
     
    var wrap = document.getElementById("clip-img-w");
    var width = wrap.offsetWidth;
    var height = wrap.offsetHeight;
   
    var clipcanvas = document.getElementById("clipcanvas");
    var drawcanvas = document.getElementById("drawcanvas");
    clipcanvas.width = width;
    clipcanvas.height = height;
    drawcanvas.width = width;
    drawcanvas.height = height;
     
 
    var clipCtx = drawcanvas.getContext("2d");
    var clipImg = document.createElement("img");
    clipImg.crossOrigin = "anonymous";
    clipImg.src = url;
    var timg = clipImg.cloneNode();
    wrap.appendChild(clipImg);
    clipImg.onload = function(){
      var x = Math.floor((width - this.width)/2);
      var y = Math.floor((height - this.height)/2);
      clipCtx.drawImage(this,0,0,timg.width,timg.height,x,y,this.width,this.height);
    }
     
     
    var ctx = clipcanvas.getContext("2d");
    ctx.fillStyle = 'rgba(0,0,0,0.6)';
    ctx.strokeStyle="green";
    var start = null;
    var clipArea = {};//裁剪范围
     
    clipcanvas.onmousedown = function(e){
      start = {
        x:e.offsetX,
        y:e.offsetY
      };
    }
    clipcanvas.onmousemove = function(e){
      if(start){
        fill(start.x,start.y,e.offsetX-start.x,e.offsetY-start.y)
      }
    }
    document.addEventListener("mouseup",function(){
      if(start){
        start = null;
        var url = startClip(clipArea);
        img.src= url;
      }
    })     
    function fill(x,y,w,h){
      ctx.clearRect(0,0,width,height);
      ctx.beginPath();
      //遮罩层
      ctx.globalCompositeOperation = "source-over";
      ctx.fillRect(0,0,width,height);
      //画框
      ctx.globalCompositeOperation = 'destination-out';
      ctx.fillRect(x,y,w,h);
      //描边
      ctx.globalCompositeOperation = "source-over";
      ctx.moveTo(x,y);
      ctx.lineTo(x+w,y);
      ctx.lineTo(x+w,y+h);
      ctx.lineTo(x,y+h);
      ctx.lineTo(x,y);
      ctx.stroke();
      ctx.closePath();
      clipArea = {
        x,
        y,
        w,
        h
      };
    }
    function startClip(area){
      var canvas = document.createElement("canvas");
      canvas.width = area.w;
      canvas.height = area.h;
       
      var data = clipCtx.getImageData(area.x,area.y,area.w,area.h);
       
      var context = canvas.getContext("2d");
      context.putImageData(data,0,0);
      return canvas.toDataURL("image/png");
    }       
  </script>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
改写一个简单的菜单 弹性大小
Dec 02 Javascript
JavaScript中几种常见排序算法小结
Feb 22 Javascript
Javascript 中的 call 和 apply使用介绍
Feb 22 Javascript
Jquery解析json数据详解
Dec 26 Javascript
jquery防止重复执行动画避免页面混乱
Apr 22 Javascript
基于Vue.js的表格分页组件
May 22 Javascript
Three.js实现绘制字体模型示例代码
Sep 26 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
Dec 19 Javascript
vue better scroll 无法滚动的解决方法
Jun 07 Javascript
angularjs1.5 组件内用函数向外传值的实例
Sep 30 Javascript
从零开始封装自己的自定义Vue组件
Oct 09 Javascript
JavaScript实现PC端横向轮播图
Feb 07 Javascript
vscode中eslint插件的配置(prettier配置无效)
Sep 10 #Javascript
layer.open回调获取弹出层参数的实现方法
Sep 10 #Javascript
VScode格式化ESlint方法(最全最好用方法)
Sep 10 #Javascript
npm 语义版本控制详解
Sep 10 #Javascript
解决layui的input独占一行的问题
Sep 10 #Javascript
解决layer.open弹出框不能获取input框的值为空的问题
Sep 10 #Javascript
防止Layui form表单重复提交的实现方法
Sep 10 #Javascript
You might like
Terran剧情介绍
2020/03/14 星际争霸
php json与xml序列化/反序列化
2013/10/28 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
微信小程序合法域名配置方法
2019/05/06 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
关于Python如何避免循环导入问题详解
2017/09/14 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
Python中format()格式输出全解
2019/04/12 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
django实现用户注册实例讲解
2019/10/30 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
宾馆总经理岗位职责
2014/02/14 职场文书
贷款担保书范文
2014/05/13 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle