canvas绘制渐变图形(Canvas实现放大镜效果完整案例分析附代码)
canvas绘制渐变图形
Canvas实现放大镜效果完整案例分析附代码本文主要记录 canvas
在图像、文字处理、离屏技术和放大镜特效的实现过程中使用到的API。先看下效果吧:
一张模糊的图片:
鼠标点击任意位置,产生放大效果:
哇塞~ 一个帅哥,哈哈哈哈~
1、放大镜原理
实现效果:如上图,点击或点击滑动鼠标显示一个区域,区域中显示对应点击部分范围的放大清晰图片。那么问题就可以肢解为3部分:
1、如何在canvas(模糊图)上再画出另外一个canvas(清晰放大图);
2、如何将canvas中显示的(清晰放大图)剪切出圆形区域。
3、如何在鼠标点击滑动的时候显示该区域;
2、显示模糊照片
其实一般的交互不是模糊照片,这里我只是为了夸张下效果,用了张模糊的原图,哈哈哈,canvas本身是可以对清晰的图片做滤镜处理,涉及到很多图形学的算法,然后我不会,默默的打开了PS手动高斯模糊了一张照片...嗯,没毛病!
首先定义一个 canvas
元素
<canvas id="canvas"></canvas>
//定义canvas画布 var canvas1 = document.getElementById('canvas1'); ctx1 = canvas.getContext('2d'); //模糊图片加载 var image1 = new Image(); image1.src = "./模糊.jpg" alt="canvas绘制渐变图形(Canvas实现放大镜效果完整案例分析附代码)" border="0" />
ctx1.drawImage(图片,x位置,y位置,图片显示宽度,图片显示高度)
3、加载清晰图片
我们再加一个canvas(放大镜看到的图片),初始隐藏:
<canvas id="canvas2" style="display:none"></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.jpg" alt="canvas绘制渐变图形(Canvas实现放大镜效果完整案例分析附代码)" border="0" />
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" alt="canvas绘制渐变图形(Canvas实现放大镜效果完整案例分析附代码)" border="0" />
到此这篇关于Canvas实现放大镜效果完整案例分析(附代码)的文章就介绍到这了,更多相关Canvas 放大镜内容请搜索开心学习网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持开心学习网!
- canvas图片裁剪(使用canvas压缩图片上传的方法示例)
- canvas绘制二进制图片(Canvas获取视频第一帧缩略图的实现)
- html 设置canvas的背景图可缩放(浅析canvas元素的html尺寸和css尺寸对元素视觉的影响)
- 微信小程序canvas 动画(微信小程序使用canvas绘制钟表)
- canvas绘制分辨率(通过canvas转换颜色为RGBA格式及性能问题的解决)
- canvas图片裁剪插件(浅析图片上传及canvas压缩的流程)
- canvas如何开启(canvas实现手机的手势解锁的步骤详细)
- 前端ui 滑动条(AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码)
- canvas心形水波(Canvas波浪花环的示例代码)
- canvas宽高技巧(canvas画图被放大且模糊的解决方法)
- html5canvas图形怎么打印(HTML5 Canvas 实现K线图的示例代码)
- canvas 裁剪画布(Canvas图片分割效果的实现)
- html5canvas怎么改扇形起始角(HTML5 Canvas实现放大镜效果示例)
- canvas怎么获取内容(详解canvas.toDataURL报错的解决方案全都在这了)
- canvas绘图画圆基本步骤(利用 Canvas实现绘画一个未闭合的带进度条的圆环)
- html5 canvas 性能(基于html5 canvas做批改作业的小插件)
- 庆八一,重读经典红色语录,感悟互联网发展硬道理(重读经典红色语录)
- TVB新剧《黯夜守护者》将播,陈展鹏陈炜首次合作探讨人性(TVB新剧黯夜守护者将播)
- 新晋小花被称女版吴卓羲 将取代滕丽名成为TVB新一代御用女警(新晋小花被称女版吴卓羲)
- 艺人吴卓羲10年警察生涯,演足10年阿Sir,系咩玩法(艺人吴卓羲10年警察生涯)
- 菲律宾潜水(菲律宾潜水价格)
- 泰国人妖(变性手术生殖器要割掉吗)
热门推荐
- C#冒泡排序
- docker搭建elasticsearch(docker安装ElasticSearch:7.8.0集群的详细教程)
- jquery中使用detach 移除元素
- 云服务器和物理服务器哪个更好(浅谈云服务器和独立服务器的八大差异)
- linux如何进入makefile(linux中无make命令的问题make: *** 没有指明目标并且找不到 makefile及make命令安装方)
- linux安装sqlserver 2008 r2(Ubuntu 下安装SQL Server教程)
- 企业会怎样筛选简历
- 如何在mysql中批量插入数据(MySQL如何快速批量插入1000w条数据)
- 微信公众号怎么申请支付接口(微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解)
- 使用python制作游戏(python制作填词游戏步骤详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9