您现在的位置是:网站首页> 编程资料编程资料
Canvas实现放大镜效果完整案例分析(附代码)HTML5 Canvas实现放大镜效果示例canvas离屏技术与放大镜实现代码示例
2021-08-30
1139人已围观
简介 这篇文章主要介绍了Canvas实现放大镜效果完整案例分析(附代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文主要记录 canvas 在图像、文字处理、离屏技术和放大镜特效的实现过程中使用到的API。先看下效果吧:
一张模糊的图片:

鼠标点击任意位置,产生放大效果:

哇塞~ 一个帅哥,哈哈哈哈~
1、放大镜原理
实现效果:如上图,点击或点击滑动鼠标显示一个区域,区域中显示对应点击部分范围的放大清晰图片。那么问题就可以肢解为3部分:
1、如何在canvas(模糊图)上再画出另外一个canvas(清晰放大图);
2、如何将canvas中显示的(清晰放大图)剪切出圆形区域。
3、如何在鼠标点击滑动的时候显示该区域;
2、显示模糊照片
其实一般的交互不是模糊照片,这里我只是为了夸张下效果,用了张模糊的原图,哈哈哈,canvas本身是可以对清晰的图片做滤镜处理,涉及到很多图形学的算法,然后我不会,默默的打开了PS手动高斯模糊了一张照片...嗯,没毛病!
首先定义一个 canvas 元素
//定义canvas画布 var canvas1 = document.getElementById('canvas1'); ctx1 = canvas.getContext('2d'); //模糊图片加载 var image1 = new Image(); image1.src = "./模糊.png"; //图片加载成功后绘制图片 image1.onload = function() { //drawImage 在画布上绘制模糊图片 ctx1.drawImage(image1, 0, 0, canvas1.width, canvas1.height); }; ctx1.drawImage(图片,x位置,y位置,图片显示宽度,图片显示高度)
3、加载清晰图片
我们再加一个canvas(放大镜看到的图片),初始隐藏:
var canvas2 = document.getElementById('canvas2'), ctx2 = canvas2.getContext('2d'), scale = 2; // 放大倍数 // canvas2的图片大小是模糊图片的2倍 canvas2.width = canvas.width * scale; canvas2.height = canvas.height * scale; // 在canvas2中加载图片 var image2 = new Image(); image2.src = "name2.png"; image2.onload = function() { ctx2.drawImage(image2, 0, 0, canvas2.width, canvas2.height); };4、显示放大镜
4.1 绘制放大镜
鼠标所处的位置点(x,y)是区域的中心,计算出清晰图所在的位置点,截取圆形
// 保存当前状态 ctx1.save(); // 边框 ctx1.strokeStyle = "#9eddf1"; ctx1.lineWidth = 3; // 开始绘制 ctx1.beginPath(); // ⚪ ctx1.arc(x, y, mr, 0, Math.PI * 2); ctx1.stroke(); // 表示剪切 ctx1.clip(); // 画图 ctx1.drawImage(that.canvas2, sx, sy, 2 * mr, 2 * mr, dx, dy, 2 * mr, 2 * mr); // 释放当前状态 ctx1.restore();

绘制状态的最佳搭档save()和restore():用于对当前状态的保存及释放不影响其他操作;可用于重复的绘制图形的变化过程;
clip():表示剪切区域
4.2 离屏技术
所谓的离屏技术就是在一个canvas上绘制另外一个canvas,前面使用的绘制图片的API是 drawImage() ,它分别可以支持,3个、5个和9个参数; 其中第一个参数既可以是图片,也可以是canvas对象!那么我们就可以使用这个方法,在圆上绘制出清晰图了~
// 圆的半径是mr var mr = 100; // 对应模糊图的左上角起点 var dx = x - mr, dy = y - mr; // 找出清晰图截图的左上角起点 var sx = x * scale - mr, sy = y * scale- mr;

... ctx.clip(); // 在对应的位置上重新绘制图片 //drawImage(img,sx,sy,swidth,sheight,x,y,width,height) 9个参数时 //img: 图片/canvas //sx: 图片的X起点 //sy: 图片的Y起点 //swidth:要绘制的图片选取的宽度 //sheight:要绘制的图片选取的高度 //x,y:图片在canvas上显示的位置 //width,height:在Canvas上要显示的大小 ctx1.drawImage(canvas2, sx, sy, 2 * mr, 2 * mr, dx, dy, 2 * mr, 2 * mr); ...
5、鼠标交互事件
效果:鼠标点击并滑动鼠标产生反应,松开鼠标或者移除画布则失效。
//定义一个判断鼠标是否是点击滑动的标识符 var flag; //鼠标点入事件 canvas.onmousedown = function(e) { flag = true; //显示放大镜 } // 鼠标移动事件 canvas.onmousemove = function(e) { if (flag) { //显示放大镜 } } //鼠标松开事件 canvas.onmouseup = function(e) { flag = false; // 隐藏放大镜 } //鼠标离开事件 canvas.onmouseout = function(e) { flag = false; // 隐藏放大镜 }完整代码:
var scale = 3; var mr = 150; var photo = { //初始化 init: function() { var that = this; that.canvas = document.getElementById('canvas'); that.ctx = that.canvas.getContext('2d'); that.canvas2 = document.getElementById('canvas2'); that.ctx2 = that.canvas2.getContext('2d'); that.canvas.width = 800; that.canvas.height = 500; that.canvas2.width = that.canvas.width * scale; that.canvas2.height = that.canvas.height * scale; that.image1 = new Image(); that.image1.src = "./name3.jpg"; that.image2 = new Image(); that.image2.src = "./name4.jpg"; that.image1.onload = function() { that.ctx.drawImage(that.image1, 0, 0, that.canvas.width, that.canvas.height); }; that.image2.onload = function() { that.ctx2.drawImage(that.image2, 0, 0, that.canvas2.width, that.canvas2.height); that.moveEvt(); }; }, bigerImage: function(x, y) { var that = this; var imageX = x * scale, imageY = y * scale, sx = imageX - mr, sy = imageY - mr; var dx = x - mr, dy = y - mr; that.ctx.save(); that.ctx.strokeStyle = "#9eddf1"; that.ctx.lineWidth = 3; that.ctx.beginPath(); that.ctx.arc(x, y, mr, 0, Math.PI * 2); that.ctx.shadowColor = "#6ed25b"; that.ctx.shadowBlur = 10; that.ctx.stroke(); that.ctx.clip(); that.ctx.drawImage(that.canvas2, sx, sy, 2 * mr, 2 * mr, dx, dy, 2 * mr, 2 * mr); that.ctx.restore(); }, //移动 moveEvt: function() { var that = this; that.canvas.onmousedown = function(e) { that.flag = true; that.showImage(e); } that.canvas.onmousemove = function(e) { if (that.flag) { that.showImage(e) } } that.canvas.onmouseup = function(e) { that.hideImage(e) } that.canvas.onmouseout = function(e) { that.hideImage(e) } }, showImage: function(e) { e.preventDefault() var x = e.offsetX, y = e.offsetY, that = this; that.ctx.clearRect(0, 0, that.canvas.width, that.canvas.height); that.ctx.drawImage(that.image1, 0, 0, that.canvas.width, that.canvas.height); that.bigerImage(x, y); }, hideImage: function(e) { e.preventDefault() var that = this; that.flag = false; that.ctx.clearRect(0, 0, that.canvas.width, that.canvas.height); that.ctx.drawImage(that.image1, 0, 0, that.canvas.width, that.canvas.height); } } window.onload = function() { photo.init(); }到此这篇关于Canvas实现放大镜效果完整案例分析(附代码)的文章就介绍到这了,更多相关Canvas 放大镜内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!
相关内容
- HTML5在手机端实现视频全屏展示方法html5 移动端视频video的android兼容(去除播放控件、全屏)HTML5轻松实现全屏视频背景的示例
- 关于HTML5+ API plusready的兼容问题html5实现点击弹出图片功能html5 录制mp3音频支持采样率和比特率设置html5表单的required属性使用html5调用摄像头实例代码HTML5页面音频自动播放的实现方式Html5大屏数据可视化开发的实现html实现弹窗的实例HTML5来实现本地文件读取和写入的实现方法HTML 罗盘式时钟的实现HTML5简单实现添加背景音乐的几种方法
- Html5原生拖拽相关事件简介以及基础实现html5 拖拽及用 js 实现拖拽功能的示例代码html5拖拽应用记录及注意点HTML5拖拽功能实现的拼图游戏HTML5拖拽API经典实例详解HTML5 拖拽批量上传文件的示例代码html5实现多图片预览上传及点击可拖拽控件详解Html5原生拖拽操作HTML5拖拽的简单实例HTML5 canvas实现移动端上传头像拖拽裁剪效果HTML5如何实现元素拖拽
- Canvas获取视频第一帧缩略图的实现HTML5 Canvas 破碎重组的视频特效的示例代码前端canvas动画如何转成mp4视频的方法canvas像素点操作之视频绿幕抠图video结合canvas实现视频在线截图功能canvas绘制视频封面的方法详解基于canvas的视频遮罩插件canvas与html5实现视频截图功能示例
- 使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果HTML5基于Three.js的图片撕碎切换动画HTML5响应式双屏图片剪辑滑动切换特效基于HTML5+CSS3实现的会员登录/注册表单切换特效源码HTML5实现仿Windows10风格的开关切换按钮效果源码HTML5+CSS3+Owl Carousel插件实现带镜头拉近特效的幻灯片切换功能源码html5实现遮罩图片滑动切换代码源码HTML5实现的菱形布局商品列表切换展示效果源码HTML5 Canvas 照片撕裂切换动画效果
- 使用layui实现左侧菜单栏及动态操作tab项的方法如何通过 display:olck/none 完成一个菜单栏Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码使用HTML+CSS实现鼠标划过的二级菜单栏的示例详解css3 Transition属性(平滑过渡菜单栏案例)菜单栏 “三” 变形为“X”css3过渡动画利用CSS实现几款不错的菜单栏实例代码CSS仿网易首页的头部菜单栏按钮和三角形制作方法纯CSS制作菜单栏当鼠标经过时会变色的利用html+css实现菜单栏缓慢下拉效果的示例代码
- 萌新HTML5 入门指南(二)萌新的HTML5 入门指南关于webview适配H5上传照片或者视频文件的方法HTML5+SVG制作文件上传ui样式特效代码浅析HTML5 meta viewport参数基于Html5+SVG制作gsap输入邮箱订阅表单特效代码详解HTML5布局和HTML5标签HTML5实现移动端点击翻牌功能html5 拖拽及用 js 实现拖拽功能的示例代码html5小程序飞入购物车(抛物线绘制运动轨迹点)HTML5逐步分析实现拖放功能的方法
- 萌新的HTML5 入门指南关于webview适配H5上传照片或者视频文件的方法HTML5+SVG制作文件上传ui样式特效代码浅析HTML5 meta viewport参数基于Html5+SVG制作gsap输入邮箱订阅表单特效代码详解HTML5布局和HTML5标签HTML5实现移动端点击翻牌功能html5 拖拽及用 js 实现拖拽功能的示例代码html5小程序飞入购物车(抛物线绘制运动轨迹点)app内嵌H5 webview 本地缓存问题的解决使用HTML5做的导航条详细步骤
- 关于webview适配H5上传照片或者视频文件的方法app内嵌H5 webview 本地缓存问题的解决Html5 webview元素定位工具的实现html5调用app分享功能示例(WebViewJavascriptBridge)
- Canvas在超级玛丽游戏中的应用详解html5实现点击弹出图片功能html5 录制mp3音频支持采样率和比特率设置html5表单的required属性使用html5调用摄像头实例代码HTML5页面音频自动播放的实现方式Html5大屏数据可视化开发的实现html实现弹窗的实例HTML5来实现本地文件读取和写入的实现方法HTML 罗盘式时钟的实现HTML5简单实现添加背景音乐的几种方法
