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 带有滚动条的表格,标题固定,带排序功能.
Nov 13 Javascript
jquery实现智能感知连接外网搜索
May 21 Javascript
JQuery伸缩导航练习示例
Nov 13 Javascript
js中iframe调用父页面的方法
Oct 30 Javascript
使用jQuery实现星级评分代码分享
Dec 09 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
Jul 06 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
angular仿支付宝密码框输入效果
Mar 25 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
详解Webpack实战之构建 Electron 应用
Dec 25 Javascript
vue项目部署到Apache服务器中遇到的问题解决
Aug 24 Javascript
浅谈vue限制文本框输入数字的正确姿势
Sep 02 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/06/27 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
调试Python程序代码的几种方法总结
2015/04/28 Python
简单了解Django ContentType内置组件
2019/07/23 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
Unix/Linux开发面试题
2016/08/16 面试题
Delphi笔试题
2016/11/14 面试题
电钳专业个人求职信
2014/01/04 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
MySQL创建管理KEY分区
2022/04/13 MySQL
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript