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中的注释使用与注意事项小结
Sep 20 Javascript
5分钟理解JavaScript中this用法分享
Nov 09 Javascript
中止javascript执行的方法
Feb 14 Javascript
AngularJS入门教程(二):AngularJS模板
Dec 06 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
JQuery+EasyUI轻松实现步骤条效果
Feb 22 Javascript
Immutable 在 JavaScript 中的应用
May 02 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
Javascript下拉刷新的简单实现
Feb 14 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
vue2 中二级路由高亮问题及配置方法
Jun 10 Javascript
JS实现放大镜效果
Sep 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
PHP+DBM的同学录程序(1)
2006/10/09 PHP
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
基于PHP文件操作的详解
2013/06/05 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
Javascript实现的分页函数
2007/02/07 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
Python分治法定义与应用实例详解
2017/07/28 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
python解析yaml文件过程详解
2019/08/30 Python
浅析python中while循环和for循环
2019/11/19 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
外贸业务员岗位职责
2013/11/24 职场文书
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js