本文主要记录 canvas 在图像、文字处理、离屏技术和放大镜特效的实现过程中使用到的API。先看下效果吧:

一张模糊的图片:



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



哇塞~ 一个帅哥,哈哈哈哈~

1、显示模糊照片

其实一般的交互不是模糊照片,这里我只是为了夸张下效果,用了张模糊的原图,哈哈哈,canvas本身是可以对清晰的图片做滤镜处理,涉及到很多图形学的算法,然后我不会,默默的打开了PS手动高斯模糊了一张照片...嗯,没毛病!

首先定义一个canvas元素

  <canvas id="canvas"></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位置,图片显示宽度,图片显示高度)

2、放大镜原理

实现效果:如上图,点击或点击滑动鼠标显示一个区域,区域中显示对应点击部分范围的放大清晰图片。那么问题就可以肢解为3部分:

1、如何在canvas(模糊图)上再画出另外一个canvas(清晰放大图);
2、如何将canvas中显示的(清晰放大图)剪切出圆形区域。
3、如何在鼠标点击滑动的时候显示该区域;

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.png"; image2.onload = function() {
ctx2.drawImage(image2, 0, 0, canvas2.width, canvas2.height);
};

3、显示放大镜

3.1 绘制放大镜

鼠标所处的位置点(x,y)是区域的中心,计算出清晰图所在的位置点,我们先假设绘制一个正方形;

// 圆的半径是mr
var mr = 100; // 对应模糊图的左上角起点
var dx = x - mr,
dy = y - mr; // 找出清晰图截图的左上角起点
var sx = x * scale - mr,
sy = y * scale- mr;

截取圆形

// 保存当前状态
ctx.save();
// 边框
ctx.strokeStyle = "#9eddf1";
ctx.lineWidth = 3;
// 开始绘制
ctx.beginPath();
//
ctx.arc(x, y, mr, 0, Math.PI * 2);
ctx.stroke();
// 表示剪切
ctx.clip();
// 释放当前状态
ctx.restore();

绘制状态的最佳搭档save()和restore():用于对当前状态的保存及释放不影响其他操作;可用于重复的绘制图形的变化过程;

clip():表示剪切区域

3.2 离屏技术

所谓的离屏技术就是在一个canvas上绘制另外一个canvas,前面使用的绘制图片的API是drawImage(),它分别可以支持,3个、5个和9个参数; 其中第一个参数既可以是图片,也可以是canvas对象!那么我们就可以使用这个方法,在圆上绘制出清晰图了~

    // 在对应的位置上重新绘制图片
//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);

4、鼠标交互事件

效果:鼠标点击并滑动鼠标产生反应,松开鼠标或者移除画布则失效。处理如下:

//定义一个判断鼠标是否是点击滑动的标识符
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;
// 隐藏放大镜
}

Canvas实现放大镜效果完整案例的更多相关文章

  1. 【HTML5】Canvas 实现放大镜效果

    图片放大镜 效果 在线演示    源码 原理 首先选择图片的一块区域,然后将这块区域放大,然后再绘制到原先的图片上,保证两块区域的中心点一致, 如下图所示: 初始化 <canvas id=&qu ...

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

    效果截图: JS代码: <script> // 初始化canvas01和上下文环境 var cav01 = document.getElementById('cav01'); var cx ...

  3. 关于jQuery中实现放大镜效果

    1.1.1 摘要 相信大家都见过或使用过放大镜效果,甚至实现过该效果,它一般应用于放大查看商品图片,一些电商网站(例如:凡客,京东商城,阿里巴巴等)都有类似的图片查看效果. 在接下来的博文中,我们将向 ...

  4. 原生js实现放大镜效果

    今天做任务的时候,有一个任务就是让实现电商网站常用的放大镜效果,类似于这样的效果,之前并没有做过这种放大镜效果,刚开始的思路是对图片进行裁剪,但是后来发现实在是难以实现,于是求助了万能的谷歌,发现一个 ...

  5. jQuery实现放大镜效果

    1.1.1 摘要 相信大家都见过或使用过放大镜效果,甚至实现过该效果,它一般应用于放大查看商品图片,一些电商网站(例如:凡客,京东商城,阿里巴巴等)都有类似的图片查看效果. 在接下来的博文中,我们将向 ...

  6. jquery放大镜效果

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...

  7. WPF设置VistualBrush的Visual属性制作图片放大镜效果

    原文:WPF设置VistualBrush的Visual属性制作图片放大镜效果 效果图片:原理:设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放. XAML代码:// ...

  8. JavaEE开发之记事本完整案例(SpringBoot + iOS端)

    上篇博客我们聊了<JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎>,并且在之前我们也聊了<Swift3.0服务端开发(五) 记事本的开发(iO ...

  9. js---电商中常见的放大镜效果

    js中的放大镜效果 在电商中,放大镜效果是很常见的,如下图所示: 当鼠标悬浮时,遮罩所在区域在右侧进行放大. 在动手写之前,我们要先理清思路,分析需求,所需知识点,再将每一块进行组装,最后进行功能的完 ...

随机推荐

  1. gorm学习地址

    1 gorm curd指南 2 gorm入门指南

  2. Dubbo系列之 (七)网络层那些事(2)

    辅助链接 Dubbo系列之 (一)SPI扩展 Dubbo系列之 (二)Registry注册中心-注册(1) Dubbo系列之 (三)Registry注册中心-注册(2) Dubbo系列之 (四)服务订 ...

  3. C#文件反序列化

    前言 最近,为了实现Unity游戏数据的加密,我都把注意力放到了C#的加密方式身上,最简单的莫过于C#的序列化了,废话不多说,直接开始 准备工作 在使用文件反序列化前我们得先引用命名空间 using ...

  4. Dubbo 常用模型

    先了解如下几个概念 Invoker Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现 ...

  5. typora的快捷键文档

    一:菜单栏 文件:alt+F 编辑:alt+E 段落:alt+P 格式:alt+O 视图:alt+V 主题:alt+T 帮助:alt+H 二:文件 新建:Ctrl+N 新建窗口:Ctrl+Shift+ ...

  6. 通过两行代码即可调整苹果电脑 Launchpad 图标大小

    之前用 13 寸 Mac 的时候我还没觉得,后来换了 16 寸就发现有点不对劲了.因为 Mac 的高分辨率,当你进入 Launchpad 界面,应用图标的大小可能会让你怀疑:这特么是苹果的设计吗?有点 ...

  7. axb_2019_heap-format_string + off-by-one

    axb_2019_heap 简单题,格式化字符串泄漏栈地址 算上rsp,格式化字符串参数是栈顺序+6-1 edit有off by one 构造unlink chunk0 chunk1 chunk2 构 ...

  8. 1.1:JAVA基础

    JAVA基础面试部分(多线程.算法.网络编程提出去了,详细分类见<面经>) 一.Java底层基础题 JDK和JRE区别? 1.JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆 ...

  9. [阿里DIN] 从论文源码学习 之 embedding层如何自动更新

    [阿里DIN] 从论文源码学习 之 embedding层如何自动更新 目录 [阿里DIN] 从论文源码学习 之 embedding层如何自动更新 0x00 摘要 0x01 DIN源码 1.1 问题 1 ...

  10. 用GitHub Pages搭建博客(一)

    什么是GitHub Pages GitHub官网介绍 GitHub Pages 官网是这样介绍的: Websites for you and your projects. 给你和你的项目的网站. Ho ...