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 相关文章推荐
利用jQuary实现文字浮动提示效果示例代码
Dec 26 Javascript
jquery统计输入文字的个数并对其进行判断
Jan 07 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
Jun 05 Javascript
JavaScript的原型继承详解
Feb 15 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
全面解析bootstrap格子布局
May 22 Javascript
Vue和Bootstrap的整合思路详解
Jun 30 Javascript
关于JavaScript中forEach和each用法浅析
Jul 27 Javascript
Vue实现按钮旋转和移动位置的实例代码
Aug 09 Javascript
layui table数据修改的回显方法
Sep 04 Javascript
Vue的属性、方法、生命周期实例代码详解
Sep 17 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 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
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
探讨如何把session存入数据库
2013/06/07 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
2015/12/19 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
js获取变量
2006/08/24 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
2011/04/28 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
js实现楼层导航功能
2017/02/23 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
Python封装shell命令实例分析
2015/05/05 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
django 环境变量配置过程详解
2019/08/06 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
植村秀加拿大官网:Shu Uemura加拿大
2019/09/03 全球购物
决心书范文
2014/03/11 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
浅谈PHP7中的一些小技巧
2021/05/29 PHP
Python 实现Mac 屏幕截图详解
2021/10/05 Python
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android