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分页对象使用示例
Apr 01 Javascript
基于jQuery实现的文字按钮表单特效整理
Dec 07 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
jQuery实现转动随机数抽奖效果的方法
May 21 Javascript
JS去掉字符串中所有的逗号
Oct 18 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
Dec 14 Javascript
ztree加载完成后显示勾选节点的实现代码
Oct 22 Javascript
微信小程序设置滚动条过程详解
Jul 25 Javascript
vue cli3 配置proxy代理无效的解决
Oct 30 Javascript
vue点击页面空白处实现保存功能
Nov 06 Javascript
Vue监听滚动实现锚点定位(双向)示例
Nov 13 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
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速度全攻略
2006/10/09 PHP
php session应用实例 登录验证
2009/03/16 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
PHP判断指定时间段的2个方法
2014/03/14 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
PHP缓冲区用法总结
2016/02/14 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
简单的js分页脚本
2009/05/21 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
常见python正则用法的简单实例
2016/06/21 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
10款最好的Python开发编辑器
2019/07/03 Python
python 提取文件指定列的方法示例
2019/08/07 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
如何强制垃圾回收
2015/10/06 面试题
必须要使用游标的SQL语句有那些
2012/05/07 面试题
护理专业学生职业生涯规划范文
2014/03/11 职场文书
关于学习的演讲稿
2014/05/10 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书