原生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 相关文章推荐
脚本安需导入(装载)的三种模式的对比
Jun 24 Javascript
两个DIV等高的JS的实现代码
Dec 23 Javascript
从数据库读取数据后将其输出成html标签的三种方法
Oct 13 Javascript
用原生JS获取CLASS对象(很简单实用)
Oct 15 Javascript
JavaScript中的object转换成number或string规则介绍
Dec 31 Javascript
jQuery实现自动滚动到页面顶端的方法
May 22 Javascript
js如何判断输入字符串长度
Dec 16 Javascript
JS组件系列之Bootstrap Icon图标选择组件
Jan 28 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
Feb 18 Javascript
jquery使用on绑定a标签无效 只能用live解决
Jun 02 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
Jul 23 Javascript
详解JavaScript中的执行上下文及调用堆栈
Apr 29 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
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
PHP在线书签系统分享
2016/01/04 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
2015/04/10 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
详解基于webpack&amp;gettext的前端多语言方案
2019/01/29 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python程序语言快速上手教程
2012/07/18 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
python移位运算的实现
2019/07/15 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
python 的topk算法实例
2020/04/02 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
经济管理专业毕业生推荐信
2013/11/11 职场文书
学生党支部先进事迹
2014/02/04 职场文书
军训拉歌口号
2014/06/13 职场文书
财务出纳岗位职责
2015/03/31 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
人事聘任通知
2015/04/21 职场文书