canvas实现图像放大镜


Posted in Javascript onFebruary 06, 2017

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

<!DOCTYPE html> 
<html> 
<head lang="en"> 
  <meta charset="UTF-8"> 
  <title>canvas-放大镜</title> 
  <style> 
    body{ 
      padding: 0px; 
      margin: 0px; 
    } 
    #canvas{ 
      border: 1px solid red; 
      margin: 100px; 
    } 
  </style> 
</head> 
<body> 
  <canvas id="canvas" width="800px" height="500px"> 
  </canvas> 
  <script> 
    //获取到canvas元素 
    var canvas = document.getElementById('canvas'); 
    //获取canvas中的画图环境 
    var context = canvas.getContext('2d'); 
 
    var img = new Image(); 
    img.src = "./image/liuyifei.jpg"; 
 
    window.onload = function(){ 
      //获取放大镜 
      getfangdajing(context,canvas,img,150,2); 
    } 
 
    /* 
    *  context:绘制环境对象, 
    *  element:canvas元素对象 
    *  img:图片对象 
    *  diameter:放大镜的大小, 
    *  ratio:图形的放大比例, 
    * (比例 = 原图 :镜中图像)0<ratio<1缩小图像,ratio>1放大图像 
    * */ 
    function getfangdajing(context,element,img,diameter,ratio){ 
      //绘制图片 
      context.drawImage(img,0,0,element.width,element.height); 
      //鼠标在element中移动触发事件 
      element.onmousemove = function (e){ 
        context.clearRect(0,0,element.width,element.height); 
        //绘制图片 
        context.drawImage(img,0,0,element.width,element.height); 
        //解决浏览器兼容问题 
        var e = e ? e : window.event; 
        //获取鼠标在element元素中的坐标值 
        var cxy = windowToCanvas(element,e.clientX,e.clientY); 
        context.save();//保存当前绘制环境 
        //获取放大镜 
        getClip(context,cxy.x,cxy.y,diameter/2); 
        //将内容放入到放大镜中显示 
        //根据鼠标点的坐标值计算出在原图的坐标值 
        var ytx0=img.width/element.width*cxy.x;//计算出鼠标在原图的X坐标值 
        var yty0=img.height/element.height*cxy.y//计算出鼠标在原图的Y坐标值 
        //(原图形/显示图形比例)* (放大镜直径/比例= 镜中的图形所占大小)= 原图要截取的图像大小 
        var ytclipValueW = img.width/element.width*diameter/ratio;//在原图截取图片的宽度 
        var ytclipValueH = img.height/element.height*diameter/ratio;//在原图截取图片的宽度 
        //.drawImage(图像对象,原图像截取的起始X坐标,原图像截取的起始Y坐标,原图像截取的宽度,原图像截取的高度, 
        // 绘制图像的起始X坐标,绘制图像的起始Y坐标,绘制图像所需要的宽度,绘制图像所需要的高度); 
        context.drawImage(img,ytx0-ytclipValueW/2,yty0-ytclipValueH/2,ytclipValueW,ytclipValueH,cxy.x-diameter/2,cxy.y-diameter/2,diameter,diameter); 
        context.restore();//恢复当前保存的绘制环境 
      } 
    } 
 
    /* 
    * 获取放大镜框:进行图层切割 
    * context:绘制环境对象 
    * x:鼠标在画布中的X坐标 
    * y:鼠标在画布中的Y坐标 
    * r:放大镜的直径 
    * */ 
    function getClip(context,x,y,r){ 
      context.beginPath(); 
      context.arc(x,y,r,0,Math.PI*2,false); 
      context.stroke(); 
      context.clip();//沿形状切除向外的图层 
    } 
 
 
    /* 
    * 坐标转换:将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 相关文章推荐
css把超出的部分显示为省略号的方法兼容火狐
Jul 23 Javascript
jquery改变disabled的boolean状态的三种方法
Dec 13 Javascript
在JS数组特定索引处指定位置插入元素的技巧
Aug 24 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
jQuery 监控键盘一段时间没输入
Apr 22 Javascript
jQuery UI Bootstrap是什么?
Jun 17 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
Jun 13 Javascript
Avalonjs双向数据绑定与监听的实例代码
Jun 23 Javascript
详解微信小程序 登录获取unionid
Jun 27 Javascript
vue.js实现三级菜单效果
Oct 19 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 Javascript
Vue-resource安装过程及使用方法解析
Jul 21 Javascript
jquery精度计算代码 jquery指定精确小数位
Feb 06 #Javascript
localStorage的黑科技-js和css缓存机制
Feb 06 #Javascript
jQuery快速实现商品数量加减的方法
Feb 06 #Javascript
jQuery EasyUI 页面加载等待及页面等待层
Feb 06 #Javascript
jQuery内容筛选选择器实例代码
Feb 06 #Javascript
jQuery基本筛选选择器实例代码
Feb 06 #Javascript
jQuery层级选择器实例代码
Feb 06 #Javascript
You might like
深入apache host的配置详解
2013/06/09 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
详解Django中Request对象的相关用法
2015/07/17 Python
python连接数据库的方法
2017/10/19 Python
python实现ID3决策树算法
2018/08/29 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
什么是Python中的顺序表
2020/06/02 Python
浅析Python面向对象编程
2020/07/10 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
CSMA/CD介质访问控制协议
2015/11/17 面试题
领导视察欢迎词
2014/01/15 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
会务接待方案
2014/02/27 职场文书
校庆活动策划方案
2014/06/05 职场文书
七夕情人节促销方案
2014/06/07 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
教师师德考核自我评价
2014/09/13 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
辞职信标准格式
2015/02/27 职场文书
免职通知
2015/04/23 职场文书
故意杀人案辩护词
2015/05/21 职场文书
《认识年月日》教学反思
2016/02/19 职场文书