canvas知识02:图片放大镜效果
效果截图:

JS代码:
<script>
// 初始化canvas01和上下文环境
var cav01 = document.getElementById('cav01');
var cxt01 = cav01.getContext('2d'); // 初始化canvas02和上下文环境
var cav02 = document.getElementById('cav02');
var cxt02 = cav02.getContext('2d'); //初始化image对象和缩放比例
var oImg = new Image();
var scale; window.onload = function(){ //设置图片路径
oImg.src = 'images/02.jpg'; //设置主canvas的宽高
cav01.width = 800;
cav01.height = 500; oImg.onload = function(){ //设置离屏canvas的宽高,与原始图片的宽高一致
cav02.width = oImg.width;
cav02.height = oImg.height; //初始化鼠标按下状态和设置缩放比例
var isMouseDown = false;
scale = cav02.width/cav01.width; //绘制图像到canvas,第二个canvas初始时是隐藏的
cxt01.drawImage( oImg, 0, 0, cav01.width, cav01.height);
cxt02.drawImage( oImg, 0, 0, cav02.width, cav02.height); //鼠标按下状态
cav01.onmousedown = function(e){ //获取鼠标相对于canvas的坐标
var pos = getMousePos(e.clientX,e.clientY); //阻止鼠标默认事件
e.preventDefault(); //调用绘制放大镜方法
drawFilterImg(true,pos); //把isMouseDown标记设置为true;
isMouseDown = true;
} //鼠标移动状态
cav01.onmousemove = function(e){
//获取鼠标相对于canvas的坐标
var pos = getMousePos(e.clientX,e.clientY);
e.preventDefault(); //根据isMouseDown状态,调用绘制放大镜方法
if(isMouseDown == true ){
drawFilterImg(true,pos);
}
} // 鼠标抬起状态
cav01.onmouseup = function(e){ //获取鼠标相对于canvas的坐标
var pos = getMousePos(e.clientX,e.clientY);
e.preventDefault(); //调用绘制放大镜方法
drawFilterImg(false); //把isMouseDown状态设置为false
isMouseDown = false;
}
} // 绘制放大镜方法 flag:用于判断是否开始绘制,pos:鼠标相对于canvas画布的坐标
function drawFilterImg(flag,pos){ //每次调用先清空canvas画布,避免出现重复图像
cxt01.clearRect( 0, 0, cav01.width, cav01.height);
cxt01.drawImage( oImg, 0, 0, cav01.width, cav01.height); //定义放大镜半径
var r = 100; if(flag == true){
//调用绘制放大区域方法
drawFilterImgCon(pos,r);
}
}
//绘制放大区域方法
function drawFilterImgCon(pos,r){ //大图图像上开始剪切的坐标
var sx = pos.x*scale - r;
var sy = pos.y*scale - r; //画在canvas上的坐标
var dx = pos.x - r;
var dy = pos.y - r; cxt01.save(); cxt01.strokeStyle = 'rgba(0,0,0,0.3)';
cxt01.lineWidth = 2; cxt01.beginPath();
cxt01.arc( pos.x, pos.y, r, 0 , Math.PI*2);
cxt01.stroke();
cxt01.clip(); cxt01.drawImage( cav02, sx, sy, r*2, r*2, dx, dy, r*2, r*2); cxt01.restore();
} //定义获取鼠标在canvas上位置的方法
//x:鼠标距离窗口的x坐标,y:鼠标距离窗口的y坐标
function getMousePos(x,y){
var oCanPos = cav01.getBoundingClientRect();
return {
x: x-oCanPos.left,
y: y-oCanPos.top
}
}
} </script>
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>canvas图片放大镜</title>
<style>
body{ background-color: #333; padding-top: 60px; }
#cav01{ display: block; margin: 0 auto; }
#cav02{ display: none;}
</style>
</head>
<body>
<!-- 主canvas -->
<canvas id="cav01" style="border:1px solid #666;"></canvas>
<!-- 离屏canvas,用于放置放大的图片,默认状态为隐藏 -->
<canvas id="cav02"></canvas>
</body>
</html>
canvas知识02:图片放大镜效果的更多相关文章
- WPF设置VistualBrush的Visual属性制作图片放大镜效果
原文:WPF设置VistualBrush的Visual属性制作图片放大镜效果 效果图片:原理:设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放. XAML代码:// ...
- Magnifier.js - 支持鼠标滚轮缩放的图片放大镜效果
Magnifier.js 是一个 JavaScript 库,能够帮助你在图像上实现放大镜效果,支持使用鼠标滚轮放大/缩小功能.放大的图像可以显示在镜头本身或它的外部容器中.Magnifier.js 使 ...
- 原生javascript实现图片放大镜效果
当我们在电商网站上购买商品时,经常会看到这样一种效果,当我们把鼠标放到我们浏览的商品图片上时,会出现类似放大镜一样的一定区域的放大效果,方便消费者观察商品.今天我对这一技术,进行简单实现,实现图片放大 ...
- 【Demo】jQuery 图片放大镜效果——模仿淘宝图片放大效果
实现功能: 模仿淘宝图片放大效果,鼠标移动到小图片的某一处,放大镜对应显示大图片的相应位置. 实现效果: 实现代码: <!DOCTYPE html> <html> <he ...
- javascript图片放大镜效果展示
javascript图片放大镜效果展示 <!DOCTYPE html> <html> <head lang="en"> <meta cha ...
- jQuery实现图片放大镜效果
实现图片放大镜的原理: 给放大镜元素一个对应的html元素为<div class='right'> 设置这个div的宽高固定为某个值(350px,350px) 设置div的css为超出部分 ...
- Canvas + JavaScript 制作图片粒子效果
首先看一下源图和转换成粒子效果的对比图: 左侧图片为源图,右侧图片为粒子效果图.该效果是在Canvas画布上制作的.将图片制作成粒子效果相对而言是比较简单的.重点了解两个知识点即可 1:图 ...
- 用css3的cursor:zoom-in/zoom-out实现微博看图片放大镜效果
1.前言 CSS3的出现解决了很多让人头疼的问题,至少我想很多童鞋都这样认为.css3的cursor属性大家用的应该是非常的多的,我想用的比较多的像cursor:pointer;cursor:help ...
- Jquery插件开发之图片放大镜效果(仿淘宝)
原网转载地址:http://www.cnblogs.com/hnvvv/archive/2011/11/19/2255197.html 需求:公司某个网站,需要实现图片预览效果,并能像淘宝一样实现局部 ...
随机推荐
- python的初体验
最近由于毕业答辩,导致一些博客没有更新,见谅,今天我们开始一些新的内容 1.python的注释 单行注释:# 多行注释: ''' 这是多行注释 我们可以在里面写很多很多的行 ''' 2.编码风格 #c ...
- Cadence17.2下载ALTERA的FPGA封装库
1. 在Cadence的安装目录里面找了下,发现都没有Altera的FPGA型号的函数库,下面的虽然是ALTERA,但是没有FPGA的器件封装 2. 去intel的官网看能不能下载到,INTEL网址, ...
- LINUX目录的意思
Linux系统/目录下的文件夹里面分别是以下内容: /usr 包含所有的命令和程序库.文档和其他文件,还包括当前linux发行版的主要应用程序 /var 包含正在操作的文件,还有记录文件.加密文件.临 ...
- Java Set集合(HashSet、TreeSet)
什么是HashSet?操作过程是怎么样的? 1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构 2.哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素 ...
- Qt Qpushbutton美化问题
昨天在论坛看到一个网友的提问,如下 我想到的第一个就是可能需要重载Pushbutton,不过看到有网友回复可以使用stykesheet解决,今天尝试了一下,还是没有成功, 一下是我使用车重载的Push ...
- SQLServer数据库慢查询追踪
不喜欢跟研发扯淡,说点击功能慢,是网络.服务器.运维的锅, 甩手给你打开慢查询,时间超过5s的全部抓取,已经很仁慈了,才抓取大于5s的SQL语句..... SQL SERVER 2014数据库慢查询追 ...
- video on web
一.video容器 你可能经常看到.avi或.mp4的视频文件,实际上avi或者mp4只是一种视频容器.打个比方,ZIP的压缩文件可以包含各种各样的文件,同理,视频容器也定义用来怎么存放各种 ...
- oracle dg 备库不同步主库数据
今天遇到一个数据库同步问题,主库被关闭,重启主库后,备库不能正常同步主库数据.只有当手动切换归档日志的时候,备库才能和主库一致. 这个问题的解决方法: 重启备库,重新应用归档日志. 操作步骤如下: / ...
- 201621123033 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- 修改虚拟机上Linux系统的IP地址
然后再输入:ifconfig eth0 192.168.11.6 netmask 255.255.255.0 . 这样就可以把网卡eth0的IP地址修改为 192.168.11.6