原生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 相关文章推荐
5款Javascript颜色选择器
Oct 25 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
Apr 18 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
Sep 24 Javascript
B/S模式项目中常用的javascript汇总
Dec 17 Javascript
laytpl 精致巧妙的JavaScript模板引擎
Aug 29 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
Nov 02 Javascript
JavaScript语言对Unicode字符集的支持详解
Dec 30 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
Oct 24 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
May 02 Javascript
Vue Components 数字键盘的实现
Sep 18 Javascript
ng-alain的sf如何自定义部件的流程
Jun 12 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
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
php中文语义分析实现方法示例
2019/09/28 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
csdn 博客的css样式 v3
2009/02/24 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
Python虚拟环境Virtualenv使用教程
2015/05/18 Python
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
解析Python中while true的使用
2015/10/13 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
python 自定义对象的打印方法
2019/01/12 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
python如何将多个PDF进行合并
2019/08/13 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
环境科学专业个人求职的自我评价
2013/11/28 职场文书
企业宗旨标语
2014/06/10 职场文书
保证书格式
2015/01/16 职场文书
西岭雪山导游词
2015/02/06 职场文书
质量保证书格式模板
2015/02/27 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python