原生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 相关文章推荐
JavaScript多线程的实现方法
May 08 Javascript
JavaScript网页制作特殊效果用随机数
May 22 Javascript
基于jquery css3实现点击动画弹出表单源码特效
Aug 31 Javascript
javascript中select下拉框的用法总结
Jan 07 Javascript
Jquery实现简单的轮播效果(代码管用)
Mar 14 Javascript
JS获取屏幕高度的简单实现代码
May 24 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
Oct 27 Javascript
JavaScript实现256色转灰度图
Feb 22 Javascript
js禁止Backspace键使浏览器后退的实现方法
Sep 01 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
Nov 30 Javascript
vue实现计算器功能
Feb 22 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 adodb介绍
2009/03/19 PHP
解析PHP中intval()等int转换时的意外异常情况
2013/06/21 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
微信小程序之购物车功能
2020/09/23 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
python3简单实现微信爬虫
2015/04/09 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
python中的对数log函数表示及用法
2020/12/09 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
希尔顿酒店中国网站:Hilton中国
2017/03/11 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
求职信的最佳写作思路
2014/02/01 职场文书
军神教学反思
2014/02/04 职场文书
刊首寄语大全
2014/04/11 职场文书
医学专业大学生求职信
2014/07/12 职场文书
建筑管理专业求职信
2014/07/28 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python