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 相关文章推荐
javscript对象原型的一些看法
Sep 19 Javascript
一段非常简单的js判断浏览器的内核
Aug 17 Javascript
sea.js常用的api简易文档
Nov 15 Javascript
js实现3d悬浮效果
Feb 16 Javascript
vue 怎么创建组件及组件使用方法
Jul 27 Javascript
jQuery事件对象的属性和方法详解
Sep 09 jQuery
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
Oct 25 Javascript
vue组件实现弹出框点击显示隐藏效果
Oct 26 Javascript
vue绑定事件后获取绑定事件中的this方法
Sep 15 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
Jul 26 Javascript
vant自定义二级菜单操作
Nov 02 Javascript
JS继承最简单的理解方式
Mar 31 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
php数据库连接
2006/10/09 PHP
初品cakephp 入门基础
2012/02/16 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
es6函数之rest参数用法实例分析
2020/04/18 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
Python批量修改文件后缀的方法
2014/01/26 Python
详解Python字符串对象的实现
2015/12/24 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
社区十八大感言
2014/01/19 职场文书
小学教师听课制度
2014/02/01 职场文书
村道德模范事迹材料
2014/08/28 职场文书
个人违纪检讨书
2014/09/15 职场文书
乌镇导游词
2015/02/02 职场文书
芙蓉镇观后感
2015/06/10 职场文书
人代会简报
2015/07/21 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
MySQL系列之十一 日志记录
2021/07/02 MySQL