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 相关文章推荐
免费空间广告万能消除代码
Sep 04 Javascript
激活 ActiveX 控件
Oct 09 Javascript
javascript同步Import,同步调用外部js的方法
Jul 08 Javascript
js 创建书签小工具之理论
Feb 25 Javascript
jQuery 属性选择器element[herf*='value']使用示例
Oct 20 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
Aug 15 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
Dec 30 Javascript
jQuery表格插件datatables用法汇总
Mar 29 Javascript
JS温故而知新之变量提升和时间死区
Jan 27 Javascript
小程序实现自定义导航栏适配完美版
Apr 02 Javascript
使用Node.js写一个代码生成器的方法步骤
May 10 Javascript
JS数组Object.keys()方法的使用示例
Jun 05 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
php修改指定文件后缀的方法
2014/09/11 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
python基础教程之udp端口扫描
2014/02/10 Python
Python的另外几种语言实现
2015/01/29 Python
Python使用剪切板的方法
2017/06/06 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
python中的json总结
2018/10/11 Python
python Tkinter版学生管理系统
2019/02/20 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
Overload和Override的区别
2012/09/02 面试题
司法建议书范文
2014/05/13 职场文书
交通志愿者活动总结
2014/06/27 职场文书
环境卫生倡议书
2014/08/29 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
售后客服个人自我评价
2014/09/14 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
集结号观后感
2015/06/08 职场文书
大学运动会通讯稿
2015/07/18 职场文书
五一放假通知怎么写
2015/08/18 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL