canvas实现图像截取功能


Posted in Javascript onFebruary 06, 2017

本文实例为大家分享了canvas图像截取的具体代码,供大家参考,具体内容如下

<!DOCTYPE html> 
<html> 
<head lang="en"> 
  <meta charset="UTF-8"> 
  <title>canvas-图像截取</title> 
  <style> 
    canvas{ 
      border: 1px dashed red; 
      float: left; 
      position: relative; 
 
    } 
  </style> 
  </head> 
<body> 
  <div id="cantox" style="position: relative"> 
    <canvas id="oldcanvas" width="500px" height="300px"> 
    </canvas> 
    <div id="cliptox" style="position: absolute;display:none"></div> 
  </div> 
  <button id ="btnclip" style="float: left">截取该区域</button> 
  <canvas id="nowcanvas" width="500px" height="300px" > 
  </canvas> 
 
  <script> 
    //获取div元素 
    var cantox = document.getElementById("cantox"); 
    var cliptox = document.getElementById("cliptox"); 
    var btnclip = document.getElementById("btnclip"); 
    //获取到canvas元素 
    var oldcanvas = document.getElementById("oldcanvas"); 
    var nowcanvas = document.getElementById("nowcanvas"); 
    //获取canvas中的画图环境 
    var oldcontext = oldcanvas.getContext('2d'); 
    var nowcontext = nowcanvas.getContext('2d'); 
 
    var img = new Image(); 
    img.src = "./image/liuyifei.jpg"; 
 
    //加载图像到canvas画布中 
    window.onload = function (){ 
      oldcontext.drawImage(img,0,0,oldcanvas.width,oldcanvas.height); 
    } 
    var startPoint;//截取图像开始坐标 
    var endPoint;//截图图像的结束坐标 
    var w; //截取图像的宽度 
    var h; //截取图像的高度 
    var flag = false; //用于判断移动事件事物控制 
    //鼠标按下事件 
    cantox.onmousedown = function (e){ 
      flag = true; 
      cliptox.style.display = 'block'; 
      startPoint = windowToCanvas(oldcanvas, e.clientX, e.clientY); 
      cliptox.style.left = startPoint.x+'px'; 
      cliptox.style.top = startPoint.y+'px'; 
    } 
 
    //鼠标移动事件 
    cantox.onmousemove = function (e){ 
      if(flag){ 
        cliptox.style.background = 'rgba(0,0,0,0.5)'; 
        endPoint = windowToCanvas(oldcanvas, e.clientX, e.clientY); 
        w = endPoint.x - startPoint.x; 
        h = endPoint.y - startPoint.y; 
        cliptox.style.width = w +'px'; 
        cliptox.style.height = h+'px'; 
      } 
    } 
    //鼠标释放事件 
    cantox.onmouseup = function (e){ 
      flag = false; 
    } 
 
    //按钮截取事件 
    btnclip.onclick = function (){ 
      imgCut(nowcontext,img,oldcanvas.width,oldcanvas.height,startPoint.x,startPoint.y,w,h); 
    } 
 
    /* 
    * 图像截取函数 
    * context:绘制环境对象 
    * image:图像对象 
    * imgElementW:图像显示的宽度 
    * imgElementH:图像显示的高度 
    * sx:截取图像的开始X坐标 
    * sy:截取图像的开始Y坐标 
    * w:截取图像的宽度 
    * h:截取图像的高度 
    * */ 
    function imgCut(context,image,imgElementW,imgElementH,sx,sy,w,h){ 
      //清理画布,便于重新绘制 
      context.clearRect(0,0,imgElementW,imgElementH); 
      //计算 :比例 = 原图像/显示图像 
      var ratioW = image.width/imgElementW; 
      var ratioH = image.height/imgElementH; 
      //根据截取图像的所占位置及大小计算出在原图所占的位置及大小 
      //.drawImage(图像对象,原图像截取的起始X坐标,原图像截取的起始Y坐标,原图像截取的宽度,原图像截取的高度, 
      // 绘制图像的起始X坐标,绘制图像的起始Y坐标,绘制图像所需要的宽度,绘制图像所需要的高度); 
      context.drawImage(image,ratioW*sx,ratioH*sy,ratioW*w,ratioH*h,0,0,w,h); 
    } 
 
    /* 
     * 坐标转换:将window中的坐标转换到元素盒子中的坐标,并返回(x,y)坐标 
     * element:canvas元素对象 
     * x:鼠标在当前窗口X坐标值 
     * y:鼠标在当前窗口Y坐标值 
     * */ 
    function windowToCanvas(element,x,y){ 
      //获取当前鼠标在window中的坐标值 
      // alert(event.clientX+"-------"+event.clientY); 
      //获取元素的坐标属性 
      var box = element.getBoundingClientRect(); 
      var bx = x - box.left; 
      var by = y - box.top; 
      return {x:bx,y:by}; 
    } 
  </script> 
</body> 
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Stop SQL Server
Jun 21 Javascript
兼容多浏览器的字幕特效Marquee的通用js类
Jul 20 Javascript
JS不能跨域借助jquery获取IP地址的方法
Aug 20 Javascript
JavaScript生成随机字符串的方法
Mar 19 Javascript
对Web开发中前端框架与前端类库的一些思考
Mar 27 Javascript
js中unicode转码方法详解
Oct 09 Javascript
Vuejs 组件——props数据传递的实例代码
Mar 07 Javascript
Angular.Js之Scope作用域的学习教程
Apr 27 Javascript
jQuery实现的简单手风琴效果示例
Aug 29 jQuery
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 Javascript
jQuery提示框插件SweetAlert用法分析
Aug 05 jQuery
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 Javascript
JS跨域请求外部服务器的资源
Feb 06 #Javascript
canvas实现动态小球重叠效果
Feb 06 #Javascript
canvas滤镜效果实现代码
Feb 06 #Javascript
canvas实现图像放大镜
Feb 06 #Javascript
jquery精度计算代码 jquery指定精确小数位
Feb 06 #Javascript
localStorage的黑科技-js和css缓存机制
Feb 06 #Javascript
jQuery快速实现商品数量加减的方法
Feb 06 #Javascript
You might like
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
jQuery 入门讲解1
2009/04/15 Javascript
javascript document.compatMode兼容性
2010/02/23 Javascript
Jquery replace 字符替换实现代码
2010/12/02 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
Python threading多线程编程实例
2014/09/18 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
2020/02/18 Python
为什么python比较流行
2020/06/19 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
物业保安员岗位职责制度
2014/01/30 职场文书
承诺书模板
2014/08/30 职场文书
写给老师的保证书
2015/05/09 职场文书
建党伟业观后感
2015/06/01 职场文书
教师节班会主持词
2015/07/06 职场文书
运动会开幕式致辞
2015/07/29 职场文书
给校长的建议书作文300字
2015/09/14 职场文书