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 相关文章推荐
javascript 处理事件绑定的一些兼容写法
Dec 24 Javascript
jquery each()源代码
Feb 14 Javascript
Linux下使用jq友好的打印JSON技巧分享
Nov 18 Javascript
html的DOM中Event对象onabort事件用法实例
Jan 21 Javascript
jQuery显示和隐藏 常用的状态判断方法
Jan 29 Javascript
JavaScript获取页面上被选中文字的方法技巧
Mar 13 Javascript
学习JavaScript设计模式之观察者模式
Apr 22 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
Mar 11 Javascript
微信小程序视图容器(swiper)组件创建轮播图
Jun 19 Javascript
浅谈Vue render函数在ElementUi中的应用
Sep 06 Javascript
微信小程序开发之tabbar图标和颜色的实现
Oct 17 Javascript
Vue动态路由缓存不相互影响的解决办法
Feb 19 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设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
通过python爬虫赚钱的方法
2019/01/29 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
详解用python生成随机数的几种方法
2019/08/04 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
python如何快速生成时间戳
2020/07/21 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
python中doctest库实例用法
2020/12/31 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
销售高级职员求职信
2013/10/29 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
节水倡议书范文
2014/04/15 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android