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 相关文章推荐
jquery简单瀑布流实现原理及ie8下测试代码
Jan 23 Javascript
url参数中有+、空格、=、%、&amp;、#等特殊符号的问题解决
May 15 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
Jul 02 Javascript
深入理解javascript的执行顺序
Apr 04 Javascript
JavaScript中window.open用法实例详解
Apr 15 Javascript
利用js实现禁止复制文本信息
Jun 03 Javascript
javascript获取本机操作系统类型的方法
Aug 13 Javascript
vue元素实现动画过渡效果
Jul 01 Javascript
微信小程序数据统计和错误统计的实现方法
Jun 26 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
Dec 30 Javascript
JS自定义对象创建与简单使用方法示例
Jan 15 Javascript
vue前端工程的搭建
Mar 31 Vue.js
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下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
js实现图片轮播效果
2015/12/19 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法详解
2019/10/15 Javascript
原生Vue 实现右键菜单组件功能
2019/12/16 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
python re模块findall()函数实例解析
2018/01/19 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
Python读取表格类型文件代码实例
2020/02/17 Python
python mock测试的示例
2020/10/19 Python
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
大专生自荐信
2013/10/04 职场文书
元旦晚会开场白
2015/05/29 职场文书
治庸问责工作总结
2015/08/11 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
python引入其他文件夹下的py文件具体方法
2021/05/23 Python
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang