本文主要记录 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 放大镜内容请搜索萬仟网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持萬仟网!

html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)相关推荐

  1. html放大镜原理,Canvas实现放大镜效果完整案例分析(附代码)

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的API.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...

  2. 如何用php新增税金一列_PHP计算个人所得税步骤详解(附代码)

    这次给大家带来PHP计算个人所得税步骤详解(附代码),PHP计算个人所得税的注意事项有哪些,下面就是实战案例,一起来看一下. 不使用速算扣除数计算个人所得税,PHP自定义函数实现个人所得税计算.使用速 ...

  3. LeetCode—5757. 矩阵中最大的三个菱形和(Get Biggest ...)[中等]—分析及代码(Java)

    LeetCode--5757. 矩阵中最大的三个菱形和[Get Biggest Three Rhombus Sums in a Grid][中等]--分析及代码[Java] 一.题目 二.分析及代码 ...

  4. java 新建 api 案列_Java利用webservice创建接口案例源码

    环境要求: JDK1.7,并配置Java的环境变量 BaseDao  接口: /** * 要使得成为一个可供访问的接口,必须添加:@WebService * */ @WebService public ...

  5. Java经典案列——模拟双色球(含完整代码)

    今天给大家分享一个Java经典案例--模拟双色球,通过这个案例对之前所学习的循环语句.数组.方法做一个简单的总结,下面先来看题目: 题目 在双色球系统中,其投注号码由六个红球和一个蓝球组成,其中红球从 ...

  6. 计算机辅助设计案列,计算机辅助设计与制造实验案例..docx

    PAGE PAGE \* MERGEFORMAT 1 计算机辅助设计与制造 上机实验 学 生: 朱路 学 号: 课程教师: 朱才朝 专业班级: 机自10班 机械工程学院 二O一四年十月 实践目的 熟悉 ...

  7. java struct 简单案列_spring与struts简单整合案例

    Spring,负责对象对象创建 Struts, 用Action处理请求 Spring与Struts框架整合, 关键点:让struts框架action对象的创建,交给spring完成! 步骤: 1)引入 ...

  8. linux select读取节点数据失败_MySQL中覆盖索引查询和select*查询执行结果案例分析...

    索引优化建议 在MySQL中要尽可能使用覆盖索引进行检索,只访问索引的查询(索引列和查询列一致),减少select * 可提高查询效率 覆盖索引(Covering Index) 理解方式一: 就是se ...

  9. 游戏中的卡片模态面板设计【1】—运用案例分析

    什么是卡片模态面板 1)什么是模态面板 模态面板是从属于应用程序主窗口的图形控制元素.它创建了一个模式--禁用主窗口但保持主窗口可见(主窗口作为背景,菜单.弹窗.二次确认等覆盖在上一层),通常可见的是 ...

最新文章

  1. 非递归遍历N-ary树Java实现
  2. Symfony2中的命名约定
  3. 麒麟linux创建用户组,麒麟Linux系统用户和组管理指南(21页)-原创力文档
  4. 使用Gatling + Gradle + Jenkins Pipeline为您的JAX-RS(和JavaEE)应用程序进行连续压力测试...
  5. 为了让盲人也能追剧,优酷做了哪些努力?
  6. 总算知道怎样从ImageMagick生成的数据转换成HICON: MagickGetImageBlob LookupIconIdFromDirectoryEx...
  7. 那个马斯克的小迷弟开始讲深度学习了,课程视频+PPT已放出
  8. 如何做好数据安全治理
  9. python中文近义词工具_python根据词条生成同义词库
  10. 软考高级 真题 2014年下半年 信息系统项目管理师 论文
  11. 产品经理如何更优商业思维
  12. javascript三角函数的使用
  13. mysql key reads 参数_mysql Key_reads 调优(转)
  14. 支付行业常见信息安全合规认证小记
  15. Help Hanzo(LightOJ - 1197)(欧拉筛 + 思维)
  16. CSS中常用的几种选择器是哪几种呢?
  17. 解决:id you register the component correctly? For recursive components, make sure to provide the “name
  18. ie8 阻止java运行_解决IE屏蔽Java Applet问题的方法
  19. 【java】tomcat配置域名访问并修改端口号
  20. dhcp服务器显示不启用,如何启用dhcp服务器

热门文章

  1. android ondestroy service,android – 在onDestroy()之后仍然运行的IntentService onHandleIntent()...
  2. 微信有电脑客户端吗_微信公众号文章下载、打印、精确搜索定位与交流方式分享...
  3. java课程设计总结迷宫_Java课程设计走迷宫详解.doc
  4. 【数理知识】辛矩阵 symplectic
  5. 验证STIL的pattern的输入输出顺序
  6. 3、C语言面试笔试--控制结构
  7. 小龟小车A2学习笔记
  8. 如何开发一个能拯救银河系的充电器
  9. 【PC工具】虚拟串口工具Configure Virtual Serial Port Driver6.9汉化版
  10. 【PC工具】更新免费文库文档下载器,破解文库下载器,免费下载文库文档