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 相关文章推荐
jquery 学习之二 属性相关
Nov 23 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
Sep 21 Javascript
js原型继承的两种方法对比介绍
Mar 30 Javascript
jQuery中find()方法用法实例
Jan 07 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
Sep 06 Javascript
JS实现数字格式千分位相互转换方法
Aug 01 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
Sep 20 Javascript
Vue.js Ajax动态参数与列表显示实现方法
Oct 20 Javascript
jQuery实现拖拽可编辑模块功能代码
Jan 12 Javascript
JS闭包的几种常见形式实例详解
Sep 16 Javascript
js时间戳与日期格式之间相互转换
Dec 11 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
Jun 06 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实现详细解析
2013/08/24 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
Python科学计算之Pandas详解
2017/01/15 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
详解python运行三种方式
2019/05/13 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
通过代码实例了解Python sys模块
2020/09/14 Python
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
采购文员岗位职责
2013/11/20 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android
vue3不同环境下实现配置代理
2022/05/25 Vue.js