碎裂效果尝试(canvas篇)

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

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

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

进入正题,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,下次再说~

时间: 2024-10-21 22:30:36

碎裂效果尝试(canvas篇)的相关文章

碎裂效果尝试(clip-path篇)

上一篇用canvas去实现碎裂的效果,优点在于性能流畅,缺点在于无法显示3D效果(没有去尝试WebGL碎裂的研究……).碎裂的实现也挺麻烦的,毕竟canvas中的clip只是获取绘图区域的一部分子区域,而并不是将某个元素取部分碎片,今天说的clip-path就不一样啦,我本身很喜欢用这个去实现碎裂 不了解clip-path可点击链接参考了解:http://www.w3cplus.com/css3/css-svg-clipping.html 先说说它的优点 1.可以实现碎片3D运动,各种乱飘,6的

Tkinter教程之Canvas篇(4)

本文转载自:http://blog.csdn.net/jcodeer/article/details/1812091 '''Tkinter教程之Canvas篇(4)''''''22.绘制弧形'''# -*- coding: cp936 -*-# 创建一个ARCfrom Tkinter import *root = Tk()# 创建一个Canvas,设置其背景色为白色cv = Canvas(root,bg = 'white')cv.create_arc((10,10,110,110),)cv.pa

Tkinter教程之Canvas篇(1)

本文转载自:http://blog.csdn.net/jcodeer/article/details/1811803 '''Tkinter教程之Canvas篇(1)'''# 提供可以用来进行绘图的Container,支持基本的几何元素,使用Canvas进行绘图时,所有的操作都是通过Canvas,不是通过它的元素# 元素的表示可以使用handle或tag.'''1.第一个Canvas程序'''# -*- coding: cp936 -*-# 指定画布的颜色为白色from Tkinter impor

Tkinter教程之Canvas篇(2)

本文转载自:http://blog.csdn.net/jcodeer/article/details/1811888 '''Tkinter教程之Canvas篇(2)''''''9.创建item的tags'''# -*- coding: cp936 -*-# 使用属性tags设置item的tag# 使用Canvas的方法gettags获取指定item的tagsfrom Tkinter import *root = Tk()# 创建一个Canvas,设置其背景色为白色cv = Canvas(root

Tkinter教程之Canvas篇(3)

本文转载自:http://blog.csdn.net/jcodeer/article/details/1811922 ''Tkinter教程之Canvas篇(3)''''''16.移动item'''# -*- coding: cp936 -*-# move指定x,y在偏移量from Tkinter import *root = Tk()# 创建一个Canvas,设置其背景色为白色cv = Canvas(root,bg = 'white')# 创建两个同样的rectangle,比较移动前后的不同r

自定义View时,用到Paint Canvas的一些温故,讲讲用路径绘画实现动画效果(基础篇 三)

转载请注明出处王亟亟的大牛之路 上礼拜上了一篇关于动画的自定义View的文章,然后里面的实现是PathMeasure,然后这一部分貌似以前没有讲过,那么就再补一篇来介绍下这部分的知识(之前一篇的传送门:http://blog.csdn.net/ddwhan0123/article/details/51066859) 直接说有点抽象,我们来看下演示的效果: 动的时候,是这样子 那暂停是这样子 其实这样的实现,一个个坐标增量画然后一直Invalidate也能做,但是写起来太麻烦,PathMeasur

UIWebView的HTML5扩展之canvas篇

先前发布大那个所谓的"HTML5"扩展严格说来还算不是"HTML5".曲曲几行JS代码就自诩为HTML5扩展多少有些标题党的嫌疑. 而相比之下,本篇的主题canvas可以说算是真正的HTML5扩展了.canvas作为HTML5标准体系下的JavaScript API, 不仅被苹果系统自带的Safari所支持,也被UIWebView类所支持. 下面直接贴上新增类目canvas部分的源代码. 完整代码下载地址:https://github.com/duzixi/UIWe

WPF效果(GIS篇)

距离上次发东西已经过去了貌似不知多少天了,突然发现自己懒得总结了.这毛病感觉不好,还得写点东西来充实一下自己,不然这样整天浑浑噩噩的过日子,也太平淡了,不管怎么说,起码得给自己的经历留下点东西吧.闲话不扯了,最近一直在忙着搞GIS的东西:国内主流的二大地图:百度和高德地图,确实直接调用SDK是很不错的选择,CEF内嵌本地html网页,JS和C#相互调用还是很给力的,这个可以选择一下的.二大原因,估计你就会放弃这个选择,第一.高分辨率的话,例如:20000*8000这个,一般应该不会遇到,浏览器貌

微信内置浏览器 如何小窗不全屏播放视频?也可以尝试canvas.

设置属性: <video height="100%" width="100%" autoplay="autoplay" controls="" x5-video-player-type="h5" x5-video-player-fullscreen="true" x5-playsinline="" playsinline="" webkit-