原生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 相关文章推荐
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
jQuery之end()和pushStack()使用介绍
Feb 07 Javascript
js中cookie的添加、取值、删除示例代码
Oct 21 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
Jul 31 Javascript
JavaScript中使用数组方法汇总
Feb 16 Javascript
JavaScript事件处理的方式(三种)
Apr 26 Javascript
js原型链与继承解析(初体验)
May 09 Javascript
AngularJS 作用域详解及示例代码
Aug 17 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
Sep 01 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
Apr 16 Javascript
p5.js临摹动态图形的方法
Oct 23 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
Jun 17 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
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
php查询whois信息的方法
2015/06/08 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
舞会礼服和舞会鞋:PromGirl
2019/04/22 全球购物
C# .NET面试题
2015/11/28 面试题
咖啡书吧创业计划书
2014/01/13 职场文书
六月份红领巾广播稿
2014/02/03 职场文书
销售人员求职信
2014/07/22 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
保留意见审计报告
2015/06/05 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
七年级上册生物的课件
2019/08/07 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers