原生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 相关文章推荐
jQuery的一些注意
Dec 06 Javascript
javascript 字符串连接的性能问题(多浏览器)
Nov 18 Javascript
jquery 多行滚动代码(附详细解释)
Jun 17 Javascript
JQuery插件jcarousellite的参数中文说明
May 11 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
AngularJS路由Ui-router模块用法示例
May 29 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
Jul 18 Javascript
Vue单页应用引用单独的样式文件的两种方式
Mar 30 Javascript
vue嵌套路由与404重定向实现方法分析
May 04 Javascript
使用vue-router为每个路由配置各自的title
Jul 30 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
Sep 21 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
PHP 编写大型网站问题集
2010/05/07 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
django实现前后台交互实例
2017/08/07 Python
Python内置模块turtle绘图详解
2017/12/09 Python
python实现三维拟合的方法
2018/12/29 Python
Python函数式编程实例详解
2020/01/17 Python
python使用建议与技巧分享(二)
2020/08/17 Python
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
银行贷款委托书范本
2014/10/11 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
建国大业观后感
2015/06/01 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python