热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

碎裂效果尝试(canvas篇)

为什么会有这篇博文,因为昨天我的杯子碎了,同个办公室的人手机屏幕碎了……碎碎平安既然说的是碎裂效果,那什么是碎裂呢,看看生活中的总而言之就是完整的一块,碎成了好些块。进入正题,canv

为什么会有这篇博文,因为昨天我的杯子碎了,同个办公室的人手机屏幕碎了……碎碎平安

既然说的是碎裂效果,那什么是碎裂呢,看看生活中的

总而言之就是完整的一块,碎成了好些块。

进入正题,canvas对于图像处理很强,毕竟直接操作像素,马赛克,翻转,二值化都很方便。但是经过我的一番尝试,说实话,canvas分割图像这方面还真挺麻烦的……

当然可能我的实现思路有问题,绕了弯,如果有更好地方法请指教,万分感激

讲了这么多,先看看几张gif,这样才有兴趣继续往下看嘛

特地让其动了起来,录制gif有点卡,真实情况下还是很平滑的

什么,你问有什么用?

那么看下一个gif

能看出来了吧,对于canvas上面所画的元素,可以让其碎成几块,然后进行移动,最后一个gif是简单裂图的,抛砖引玉一下

好了效果看完了,如果感兴趣决定继续往下看那就继续吧~

————————————————————————————————————————————————————————————————————————

首先说原理,我实现的原理

核心是canvas中画布的clip方法,不知道的简单看一下w3school关于clip简短的介绍

http://www.w3school.com.cn/tags/canvas_clip.asp

其实这个很坑,怎么坑了?

这又要说canvas的绘图了,它不同于SVG,SVG画一个圆,是创建了一个circle的SVG标签,添加到DOM中,你可以获取到这个圆的DOM节点,可以用js去读它的信息和进行操作。而canvas不行,它画了一个圆,只是在其画布上进行了一个操作,画布还是整个画布,你若是想移动这个圆,必须通过一系列重绘这个圆的坐标实现,不过速度比SVG快,原因DOM的重新渲染很耗时间和内存。

把canvas这个特点带到clip中成了什么情况?还是拿圆来举例,画了一个圆

我们用下clip看一下结果,下面是代码

oGC.save();
oGC.beginPath();
oGC.fillStyle = 'red';  //注意红色

oGC.moveTo(0, 400);
oGC.lineTo(300, 200);
oGC.lineTo(0, 0);
oGC.fill();  //①

oGC.clip();
oGC.closePath();
oGC.restore();

呵呵,果然canvas并不是把这个圆给切割开(看代码这种面向过程一顺溜下来也知道不关乎圆的事……)

仅仅获取到一个单独的操作区域,为什么说是单独的呢,代码和结果来解释

oGC.save();
oGC.beginPath();
oGC.fillStyle = 'red';

oGC.moveTo(0, 400);
oGC.lineTo(300, 200);
oGC.lineTo(0, 0);
oGC.fill();

oGC.clip();
oGC.closePath();

oGC.fillStyle = 'green';    //注意这个绿色
oGC.fillRect(100, 100, 200, 200);

oGC.restore();

结果如下

画成了一个不完整的长方形出来,代表clip切割出来的仅仅是画布的一部分,后续的操作只在这片区域有效(restore之后还原)

所以我们在clip之后需要再画一个圆,这样才能得到被切割的部分

现在问题来了,请往上翻看第一个gif,如何实现这样的效果呢

先给大家看看失败的情况

失败情况之移动再次画的圆:

特地加了红线让大家看清楚

失败情况之移动clip区域:

此时是不是觉得胜利就在眼前了,如果同时移动圆和clip区域呢!!!

结果如下,Fail!

这个结果更加证明了canvas的clip原理是什么鬼

那该怎么办呢,我实现第一张gif的方法是预先用clip获取需要切割的区域,然后画圆将其填充底色遮住,后面第二次clip和画圆的坐标是一直变动的

所以说很蛋疼!

上传了最后那个gif栗子的代码到github

地址是:https://github.com/westAnHui/imageCut-canvas

代码虽然无注释,但是应该还挺好懂的。栗子很简单,不过可扩展性还是有的,我在一张图片上面只取了一个点,如果可以取多点呢?加上一些特别的动画呢?不过那么又会有很多麻烦,不过还是值得研究研究的。

这篇文章也就算结束了,排版的比较乱,请见谅……

标题上面是canvas篇,当然后面还有其他的实现,我自己最喜欢的是用CSS的clip-path,下次再说~


推荐阅读
  • 本文深入探讨了 iOS 开发中 `int`、`NSInteger`、`NSUInteger` 和 `NSNumber` 的应用与区别。首先,我们将详细介绍 `NSNumber` 类型,该类用于封装基本数据类型,如整数、浮点数等,使其能够在 Objective-C 的集合类中使用。通过分析这些类型的特性和应用场景,帮助开发者更好地理解和选择合适的数据类型,提高代码的健壮性和可维护性。苹果官方文档提供了更多详细信息,可供进一步参考。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • 通过优化模板消息机制,本研究提出了一种高效的信息化推送方案。该方案利用获取的访问令牌(access token)和指定的模板ID,实现了精准且快速的信息推送,显著提升了用户体验和信息传递效率。具体实现中,通过调用相关API接口,确保了消息的准确性和及时性,为用户提供更加便捷的服务。 ... [详细]
  • Java服务问题快速定位与解决策略全面指南 ... [详细]
  • jQuery Flot 数据可视化插件:高效绘制图表的专业工具
    jQuery Flot 是一款高效的数据可视化插件,专为绘制各种图表而设计。该工具支持丰富的图表类型和自定义选项,适用于多种应用场景。用户可以通过其官方网站获取示例代码和下载资源,以便快速上手和使用。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 新年伊始,正是学习的最佳时机。本文全面解析了CK1957-Zookeeper的核心概念与实践技巧,旨在帮助初学者快速掌握这一深度学习工具。通过详细的理论讲解和实际操作示例,读者可以更好地理解Zookeeper的工作原理及其在分布式系统中的应用。无论是新手还是有一定基础的学习者,都能从中受益匪浅。 ... [详细]
  • ylbtech-进销存管理解决方案:进销存管理,即购销链管理,涵盖企业从采购(进)、库存(存)到销售(销)的全流程动态管控。其中,“进”涉及从市场询价、供应商选择、采购执行直至货物入库及支付流程;“销”则包括产品定价、客户报价、订单处理及销售出库等环节。该解决方案旨在通过信息化手段,提升企业运营效率,优化库存结构,增强市场响应速度。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 高效批量文件重命名软件
    开发了一款基于Python的高效批量文件重命名软件,并集成了wxWidgets图形用户界面,使用cxfreeze将其打包为独立的可执行文件(exe)。该工具适用于需要频繁处理大量文件的用户,能够显著提高文件管理效率。详细使用说明包含在软件压缩包内。开发环境为Python 2.7和wxWidgets 3.0,运行环境要求兼容Windows系统。 ... [详细]
  • 解决基于XML配置的MyBatis在Spring整合中出现“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”问题的方法
    在将Spring与MyBatis进行整合时,作者遇到了“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”的问题。该问题主要出现在使用XML文件配置DAO层的情况下,而注解方式配置则未出现类似问题。作者详细分析了两个配置文件之间的差异,并最终找到了解决方案。本文将详细介绍问题的原因及解决方法,帮助读者避免类似问题的发生。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
author-avatar
拍友2502883387
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有