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中给animation加更多的运作效果实例
Sep 05 Javascript
jquery 检测元素是否存在的实例代码
Nov 19 Javascript
jQuery实现根据类型自动显示和隐藏表单
Mar 18 Javascript
jQuery实现只允许输入数字和小数点的方法
Mar 02 Javascript
Ionic如何创建APP项目
Jun 03 Javascript
js基于setTimeout与setInterval实现多线程
Jun 17 Javascript
AngularJS指令与指令之间的交互功能示例
Dec 14 Javascript
jQuery滚动监听实现商城楼梯式导航效果
Mar 06 Javascript
详解vue-cli本地环境API代理设置和解决跨域
Sep 05 Javascript
详解tween.js 中文使用指南
Jan 05 Javascript
Vue.Draggable拖拽功能的配置使用方法
Jul 29 Javascript
这15个Vue指令,让你的项目开发爽到爆
Oct 11 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 Smarty生成EXCEL文档的代码
2008/08/23 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
Element中Slider滑块的具体使用
2020/07/29 Javascript
Python中返回字典键的值的values()方法使用
2015/05/22 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
使用Python实现画一个中国地图
2019/11/23 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
详解Anaconda 的安装教程
2020/09/23 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
adidas美国官网:adidas US
2016/09/21 全球购物
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
建筑院校毕业生求职信
2014/06/13 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
纪委立案决定书
2015/06/24 职场文书
学雷锋活动简报
2015/07/20 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
浅谈Web Storage API的使用
2021/06/23 Javascript
MongoDB数据库之添删改查
2022/04/26 MongoDB