发明内容
本发明实施例所要解决的技术问题在于,提供一种实现水波纹荡漾特效的方法和装置。可对视频或图像添加动态特效,增加了用户的使用乐趣,提升了用户体验。
为了解决上述技术问题,本发明实施例提供了一种实现水波纹荡漾特效的方法,包括:
获取波源点,并根据所述波源点和预设的荡漾程度确定当前帧区域中水面上的荡漾区域;
根据预设的第一公式计算所述当前帧区域中水面上的荡漾区域内的每个像素位置的波幅值,所述第一公式为:当前帧区域中像素位置(x,y)的波幅值=上一帧图像中像素位置(x,y)的波幅值+(预设的荡漾程度-像素位置(x,y)与波源点间的距离)*预设的荡漾高度,其中所述当前帧区域与所述上一帧图像的尺寸相同,0<x<当前帧区域的宽度,0<y<当前帧区域的高度;
根据所述当前帧区域中的每个像素位置的波幅值确定像素偏移量,并根据所述像素偏移量将上一帧图像中的每个像素复制到当前帧区域中对应的像素位置,得到当前帧图像。
其中,所述方法还包括:
根据当前帧图像中的每个像素位置及其相邻的像素位置的波幅值分别计算下一帧区域中该像素位置的波幅值,其中所述下一帧区域与所述当前帧图像的尺寸相同。
其中,所述根据当前帧图像中的每个像素位置及其相邻的像素位置的波幅值分别计算下一帧区域中该像素位置的波幅值的步骤具体包括:
根据第二公式计算下一帧区域中像素位置(x,y)的理想波幅值,所述第二公式为:下一帧区域中像素位置(x,y)的理想波幅值=(当前帧图像中像素位置(x-1,y-1)的波幅值+当前帧图像中像素位置(x-1,y)的波幅值+当前帧图像中像素位置(x-1,y+1)的波幅值+当前帧图像中像素位置(x,y-1)的波幅值+当前帧图像中像素位置(x,y+1)的波幅值+当前帧图像中像素位置(x+1,y-1)的波幅值+当前帧图像中像素位置(x+1,y)的波幅值+当前帧图像中像素位置(x+1,y+1)的波幅值)/2-当前帧图像中像素位置(x,y)的波幅值;
将所述下一帧区域中像素位置(x,y)的理想波幅值乘以衰减系数,得到所述下一帧区域中像素位置(x,y)的波幅值。
其中,所述当前帧区域中水面上的荡漾区域为水面上在以所述波源点为圆心、以所述预设的荡漾程度为半径的圆内的区域。
其中,所述根据所述当前帧区域中的每个像素位置的波幅值确定像素偏移量,并根据所述像素偏移量将上一帧图像中的每个像素复制到当前帧区域中对应的像素位置的步骤具体包括:
将所述当前帧区域中像素位置(x-1,y)的波幅值与所述当前帧区域中像素位置(x+1,y)的波幅值之差作为上一帧图像中像素位置(x,y)上像素的水平偏移量dx,将所述当前帧区域中像素位置(x,y-1)的波幅值与所述当前帧区域中像素位置(x,y+1)的波幅值之差作为上一帧图像中像素位置(x,y)上像素的垂直偏移量dy;
将所述上一帧图像中像素位置(x+dx,y+dy)上的像素复制到所述当前帧区域中的像素位置(x,y),得到当前帧图像。
相应地,本发明实施例还提供了一种实现水波纹荡漾特效的装置,包括:
荡漾触发模块,用于获取波源点,并根据所述波源点和预设的荡漾程度确定当前帧区域中水面上的荡漾区域;
荡漾初次波幅计算模块,用于根据预设的第一公式计算所述当前帧区域中水面上的荡漾区域内的每个像素位置的波幅值,所述第一公式为:当前帧区域中像素位置(x,y)的波幅值=上一帧图像中像素位置(x,y)的波幅值+(预设的荡漾程度-像素位置(x,y)与波源点间的距离)*预设的荡漾高度,其中所述当前帧区域与所述上一帧图像的尺寸相同,0<x<当前帧区域的宽度,0<y<当前帧区域的高度;
图像生成模块,用于根据所述当前帧区域中的每个像素位置的波幅值确定像素偏移量,并根据所述像素偏移量将上一帧图像中的每个像素复制到当前帧区域中对应的像素位置,得到当前帧图像。
其中,所述装置还包括:
荡漾持续波幅计算模块,用于根据当前帧图像中的每个像素位置及其相邻的像素位置的波幅值分别计算下一帧区域中该像素位置的波幅值,其中所述下一帧区域与所述当前帧图像的尺寸相同。
其中,所述荡漾持续波幅计算模块具体包括:
理想波幅值计算模块,用于根据第二公式计算下一帧区域中像素位置(x,y)的理想波幅值,所述第二公式为:下一帧区域中像素位置(x,y)的理想波幅值=(当前帧图像中像素位置(x-1,y-1)的波幅值+当前帧图像中像素位置(x-1,y)的波幅值+当前帧图像中像素位置(x-1,y+1)的波幅值+当前帧图像中像素位置(x,y-1)的波幅值+当前帧图像中像素位置(x,y+1)的波幅值+当前帧图像中像素位置(x+1,y-1)的波幅值+当前帧图像中像素位置(x+1,y)的波幅值+当前帧图像中像素位置(x+1,y+1)的波幅值)/2-当前帧图像中像素位置(x,y)的波幅值;
衰减波幅值计算模块,用于将所述下一帧区域中像素位置(x,y)的理想波幅值乘以衰减系数,得到所述下一帧区域中像素位置(x,y)的波幅值。
其中,所述当前帧区域中水面上的荡漾区域为水面上在以所述波源点为圆心、以所述预设的荡漾程度为半径的圆内的区域。
其中,所述图像生成模块具体包括:
偏移量计算模块,用于将所述当前帧区域中像素位置(x-1,y)的波幅值与所述当前帧区域中像素位置(x+1,y)的波幅值之差作为上一帧图像中像素位置(x,y)上像素的水平偏移量dx,将所述当前帧区域中像素位置(x,y-1)的波幅值与所述当前帧区域中像素位置(x,y+1)的波幅值之差作为上一帧图像中像素位置(x,y)上像素的垂直偏移量dy;
像素复制模块,用于将所述上一帧图像中像素位置(x+dx,y+dy)上的像素复制到所述当前帧区域中的像素位置(x,y),得到当前帧图像。
实施本发明实施例,具有如下有益效果:通过根据上一帧图像中的每个像素位置的波幅值计算当前帧区域中每个像素位置的波幅值,并根据当前帧区域中每个像素位置的波幅值计算像素偏移量,再根据像素偏移量将上一帧图像中的像素复制到当前帧区域中对应的像素位置,可以简单快速地对视频或图像添加水波纹荡漾的动态特效,效果逼真,看起来好像在水底播放,从而增加了用户的使用乐趣,提升了用户体验。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参见图1,是本发明提供的实现水波纹荡漾特效的方法的第一实施例流程图,该方法包括:
在步骤S100,获取波源点,并根据该波源点和预设的荡漾程度确定当前帧区域中水面上的荡漾区域。
在步骤S101,根据预设的第一公式计算当前帧区域中水面上的荡漾区域内的每个像素位置的波幅值。其中,第一公式可以为:当前帧区域中像素位置(x,y)的波幅值=上一帧图像中像素位置(x,y)的波幅值+(预设的荡漾程度-像素位置(x,y)与波源点间的距离)*预设的荡漾高度,其中当前帧区域与上一帧图像的尺寸相同,0<x<当前帧区域的宽度,0<y<当前帧区域的高度。
在步骤S102,根据当前帧区域中的每个像素位置的波幅值确定像素偏移量,并根据像素偏移量将上一帧图像中的每个像素复制到当前帧区域中对应的像素位置,得到当前帧图像。
本发明实施例提供的实现水波纹荡漾特效的方法,通过根据上一帧图像中的每个像素位置的波幅值计算当前帧区域中每个像素位置的波幅值,并根据当前帧区域中每个像素位置的波幅值计算像素偏移量,再根据像素偏移量将上一帧图像中的像素复制到当前帧区域中对应的像素位置,可以简单快速地对视频或图像添加水波纹荡漾的动态特效,效果逼真,看起来好像在水底播放,从而增加了用户的使用乐趣,提升了用户体验。
参见图2,是本发明提供的实现水波纹荡漾特效的方法的第二实施例流程图,该方法包括:
在步骤S200,获取波源点,并根据该波源点和预设的荡漾程度确定当前帧区域中水面上的荡漾区域。具体地,可以随机地选取当前帧区域中水面上的某一点作为波源点,也可以获取显示界面上被点击的位置作为波源点。预设的荡漾程度的取值范围可以是0~100。
在步骤S201,根据预设的第一公式,计算当前帧区域中水面上的荡漾区域内的每个像素位置的波幅值。其中,第一公式可以为:当前帧区域中像素位置(x,y)的波幅值=上一帧图像中像素位置(x,y)的波幅值+(预设的荡漾程度-像素位置(x,y)与波源点间的距离)*预设的荡漾高度,其中当前帧区域与上一帧图像的尺寸相同,0<x<当前帧区域的宽度,0<y<当前帧区域的高度。当前帧区域中不属于荡漾区域的像素位置的波幅值与上一帧图像中相同像素位置的波幅值相同。具体地,水面在初始状态时是个平面,各像素位置的初始波幅值均为0。预设的荡漾高度的取值范围可以是0~1000。
在步骤S202,根据当前帧区域中的每个像素位置的波幅值确定像素偏移量,并根据像素偏移量将上一帧图像中的每个像素复制到当前帧区域中对应的像素位置,得到当前帧图像。因为水的折射,当水面不与我们的视线相垂直的时候,我们所看到的水下的景物并不是在观察点的正下方,而存在一定的偏移。因此,进行像素偏移处理后再生成当前帧图像,可以得到更加逼真的效果,看起来就像在水底播放一样。
在步骤S203,根据当前帧图像中的每个像素位置及其相邻的像素位置的波幅值分别计算下一帧区域中该像素位置的波幅值,其中下一帧区域与当前帧图像的尺寸相同。通过在波源点引起的初次荡漾后继续计算下一帧中的每个像素位置的波幅值,可以将一个波源点引起的荡漾时间延长,实现波纹起伏、更加真实的荡漾效果。
在步骤S204中,将下一帧区域作为当前帧区域。然后返回步骤S202。
在具体实施过程中,可以设置两个临时存储空间A和B,即bufA[width*height]和bufB[width*height](width为图像的宽度,height为图像的高度),存储空间A和B 的大小与原始图像的大小一样,分别用于保存水面上每一个点的前一个时刻和后一个时刻的波幅数据。也就是说,临时存储空间A和B分别用于存储相邻的两个帧图像中的水面上的点的波幅值。
参见图3,是本发明提供的实现水波纹荡漾特效的方法的第三实施例流程图,图3是对图2所示实施例的更加详细的说明。如图3所示,该方法包括:
在步骤S300,获取波源点,并根据该波源点和预设的荡漾程度确定当前帧区域中水面上的荡漾区域。具体地,可以随机地选取当前帧区域中水面上的某一点作为波源点,也可以获取显示界面上被点击的位置作为波源点。该波源点引起的荡漾区域可以为水面上在以该波源点为圆心、以预设的荡漾程度为半径的圆内的区域。预设的荡漾程度的取值范围可以是0~100。
在步骤S301,根据预设的第一公式,计算当前帧区域中水面上的荡漾区域内的每个像素位置的波幅值。其中,第一公式可以为:当前帧区域中像素位置(x,y)的波幅值=上一帧图像中像素位置(x,y)的波幅值+(预设的荡漾程度-像素位置(x,y)与波源点间的距离)*预设的荡漾高度,其中当前帧区域与上一帧图像的尺寸相同,0<x<当前帧区域的宽度,0<y<当前帧区域的高度。当前帧区域中不属于荡漾区域的像素位置的波幅值与上一帧图像中相同像素位置的波幅值相同。具体地,水面在初始状态时是个平面,各像素位置的初始波幅值均为0。预设的荡漾高度的取值范围可以是0~1000。
在步骤S302,将当前帧区域中像素位置(x-1,y)的波幅值与当前帧区域中像素位置(x+1,y)的波幅值之差作为上一帧图像中像素位置(x,y)上像素的水平偏移量dx,将当前帧区域中像素位置(x,y-1)的波幅值与当前帧区域中像素位置(x,y+1)的波幅值之差作为上一帧图像中像素位置(x,y)上像素的垂直偏移量dy。因为折射引起的偏移的程度与水波的斜率、水的折射率以及水的深度等都有关系,如果要进行精确的计算的话,显然是很不现实的。因此,我们只需要做线性的近似处理就行了。由于水面越倾斜,所看到的水下景物偏移量就越大,所以近似地用水面上某像素位置的前后、左右两像素位置的波幅之差来代表所看到的水底景物的偏移量,不仅保障了逼真的效果,而且加快了运算速率,降低了对硬件的要求。
在步骤S303,将上一帧图像中像素位置(x+dx,y+dy)上的像素复制到当前帧区域中的像素位置(x,y),得到当前帧图像。
在步骤S304,根据第二公式计算下一帧区域中像素位置(x,y)的理想波幅值。其中,第二公式为:下一帧区域中像素位置(x,y)的理想波幅值=(当前帧图像中像素位置(x-1,y-1)的波幅值+当前帧图像中像素位置(x-1,y)的波幅值+当前帧图像中像素位置(x-1,y+1)的波幅值+当前帧图像中像素位置(x,y-1)的波幅值+当前帧图像中像素位置(x,y+1)的波幅值+当前帧图像中像素位置(x+1,y-1)的波幅值+当前帧图像中像素位置(x+1,y)的波幅值+当前帧图像中像素位置(x+1,y+1)的波幅值)/2-当前帧图像中像素位置(x,y)的波幅值。
在步骤S305,将下一帧区域中像素位置(x,y)的理想波幅值乘以衰减系数,得到下一帧区域中像素位置(x,y)的波幅值。优选地,衰减系数为2/3。但是,衰减系数并不限于2/3。由于水具有阻力,每一时刻某像素位置的波幅值都应比上一时刻该像素位置的波幅值衰减一些,这样可以使水波纹荡漾的幅度越来越小,达到更加真实的模拟效果。
在步骤S306,将下一帧区域作为当前帧区域。然后返回步骤S302。
在图2-3所示的实施例中,可以在一个波源点引起的荡漾尚未结束时获取其他一个或多个波源点,实现更加丰富真实的动画效果。例如,在步骤S204或步骤S306之后,可以包括步骤:判断是否有新的波源点产生,若判断为是,则返回步骤S200或步骤S300;若判断为否,则返回步骤S202或S302。
参见图4,是本发明提供的实现水波纹荡漾特效的装置的第一实施例结构示意图,该装置包括:
荡漾触发模块410,用于获取波源点,并根据该波源点和预设的荡漾程度确定当前帧区域中水面上的荡漾区域。
荡漾初次波幅计算模块420,用于根据预设的第一公式计算当前帧区域中水面上的荡漾区域内的每个像素位置的波幅值。其中,第一公式可以为:当前帧区域中像素位置(x,y)的波幅值=上一帧图像中像素位置(x,y)的波幅值+(预设的荡漾程度-像素位置(x,y)与波源点间的距离)*预设的荡漾高度,其中当前帧区域与上一帧图像的尺寸相同,0<x<当前帧区域的宽度,0<y<当前帧区域的高度。
图像生成模块430,用于根据当前帧区域中的每个像素位置的波幅值确定像素偏移量,并根据像素偏移量将上一帧图像中的每个像素复制到当前帧区域中对应的像素位置,得到当前帧图像。
本发明实施例提供的实现水波纹荡漾特效的装置,通过根据上一帧图像中的每个像素位置的波幅值计算当前帧区域中每个像素位置的波幅值,并根据当前帧区域中每个像素位置的波幅值计算像素偏移量,再根据像素偏移量将上一帧图像中的像素复制到当前帧区域中对应的像素位置,可以简单快速地对视频或图像添加水波纹荡漾的动态特效,效果逼真,看起来好像在水底播放,从而增加了用户的使用乐趣,提升了用户体验。
参见图5,是本发明提供的实现水波纹荡漾特效的装置的第二实施例结构示意图,该装置包括:
荡漾触发模块510,用于获取波源点,并根据该波源点和预设的荡漾程度确定当前帧区域中水面上的荡漾区域。具体地,荡漾触发模块510可以随机地选取当前帧区域中水面上的某一点作为波源点,荡漾触发模块510还可以获取显示界面上被点击的位置作为波源点。预设的荡漾程度的取值范围可以是0~100。
荡漾初次波幅计算模块520,用于根据预设的第一公式,计算当前帧区域中水面上的荡漾区域内的每个像素位置的波幅值。其中,第一公式可以为:当前帧区域中像素位置(x,y)的波幅值=上一帧图像中像素位置(x,y)的波幅值+(预设的荡漾程度-像素位置(x,y)与波源点间的距离)*预设的荡漾高度,其中当前帧区域与上一帧图像的尺寸相同,0<x<当前帧区域的宽度,0<y<当前帧区域的高度。当前帧区域中不属于荡漾区域的像素位置的波幅值与上一帧图像中相同像素位置的波幅值相同。具体地,水面在初始状态时是个平面,各像素位置的初始波幅值均为0。预设的荡漾高度的取值范围可以是0~1000。
图像生成模块530,用于根据当前帧区域中的每个像素位置的波幅值确定像素偏移量,并根据像素偏移量将上一帧图像中的每个像素复制到当前帧区域中对应的像素位置,得到当前帧图像。因为水的折射,当水面不与我们的视线相垂直的时候,我们所看到的水下的景物并不是在观察点的正下方,而存在一定的偏移。因此,进行像素偏移处理后再生成当前帧图像,可以得到更加逼真的效果,看起来就像在水底播放一样。
荡漾持续波幅计算模块540,用于根据当前帧图像中的每个像素位置及其相邻的像素位置的波幅值分别计算下一帧区域中该像素位置的波幅值,其中下一帧区域与当前帧图像的尺寸相同。通过在波源点引起的初次荡漾后继续计算下一帧中的每个像素位置的波幅值,可以将一个波源点引起的荡漾时间延长,实现波纹起伏、更加真实的荡漾效果。
在具体实施过程中,本装置还可以包括两个临时存储空间A和B,即bufA[width*height]和bufB[width*height](width为图像的宽度,height为图像的高度),存储空间A和B 的大小与原始图像的大小一样,分别用于保存水面上每一个点的前一个时刻和后一个时刻的波幅数据。也就是说,临时存储空间A和B分别用于存储相邻的两个帧图像中的水面上的点的波幅值。
参见图6,是本发明提供的实现水波纹荡漾特效的装置的第三实施例结构示意图,图6是对图5所示实施例的更加详细的说明。如图6所示,该装置包括:
荡漾触发模块610,用于获取波源点,并根据该波源点和预设的荡漾程度确定当前帧区域中水面上的荡漾区域。具体地,荡漾触发模块610可以随机地选取当前帧区域中水面上的某一点作为波源点,荡漾触发模块610还可以获取显示界面上被点击的位置作为波源点。该波源点引起的荡漾区域可以为水面上在以该波源点为圆心、以预设的荡漾程度为半径的圆内的区域。预设的荡漾程度的取值范围可以是0~100。
荡漾初次波幅计算模块620,用于根据预设的第一公式,计算当前帧区域中水面上的荡漾区域内的每个像素位置的波幅值。其中,第一公式可以为:当前帧区域中像素位置(x,y)的波幅值=上一帧图像中像素位置(x,y)的波幅值+(预设的荡漾程度-像素位置(x,y)与波源点间的距离)*预设的荡漾高度,其中当前帧区域与上一帧图像的尺寸相同,0<x<当前帧区域的宽度,0<y<当前帧区域的高度。当前帧区域中不属于荡漾区域的像素位置的波幅值与上一帧图像中相同像素位置的波幅值相同。具体地,水面在初始状态时是个平面,各像素位置的初始波幅值均为0。预设的荡漾高度的取值范围可以是0~1000。
图像生成模块630包括偏移量计算模块631和像素复制模块632。
偏移量计算模块631,用于将当前帧区域中像素位置(x-1,y)的波幅值与当前帧区域中像素位置(x+1,y)的波幅值之差作为上一帧图像中像素位置(x,y)上像素的水平偏移量dx,将当前帧区域中像素位置(x,y-1)的波幅值与当前帧区域中像素位置(x,y+1)的波幅值之差作为上一帧图像中像素位置(x,y)上像素的垂直偏移量dy。因为折射引起的偏移的程度与水波的斜率、水的折射率以及水的深度等都有关系,如果要进行精确的计算的话,显然是很不现实的。因此,我们只需要做线性的近似处理就行了。由于水面越倾斜,所看到的水下景物偏移量就越大,所以近似地用水面上某像素位置的前后、左右两像素位置的波幅之差来代表所看到的水底景物的偏移量,不仅保障了逼真的效果,而且加快了运算速率,降低了对硬件的要求。
像素复制模块632,用于将上一帧图像中像素位置(x+dx,y+dy)上的像素复制到当前帧区域中的像素位置(x,y),得到当前帧图像。
荡漾持续波幅计算模块640包括理想波幅值计算模块641和衰减波幅值计算模块642。
理想波幅值计算模块641用于根据第二公式计算下一帧区域中像素位置(x,y)的理想波幅值。其中,第二公式为:下一帧区域中像素位置(x,y)的理想波幅值=(当前帧图像中像素位置(x-1,y-1)的波幅值+当前帧图像中像素位置(x-1,y)的波幅值+当前帧图像中像素位置(x-1,y+1)的波幅值+当前帧图像中像素位置(x,y-1)的波幅值+当前帧图像中像素位置(x,y+1)的波幅值+当前帧图像中像素位置(x+1,y-1)的波幅值+当前帧图像中像素位置(x+1,y)的波幅值+当前帧图像中像素位置(x+1,y+1)的波幅值)/2-当前帧图像中像素位置(x,y)的波幅值。
衰减波幅值计算模块642用于将下一帧区域中像素位置(x,y)的理想波幅值乘以衰减系数,得到下一帧区域中像素位置(x,y)的波幅值。优选地,衰减系数为2/3。但是,衰减系数并不限于2/3。由于水具有阻力,每一时刻某像素位置的波幅值都应比上一时刻该像素位置的波幅值衰减一些,这样可以使水波纹荡漾的幅度越来越小,达到更加真实的模拟效果。
在图5-6所示的实施例中,荡漾触发模块510或610可以在一个波源点引起的荡漾尚未结束时获取其他一个或多个波源点,实现更加丰富真实的动画效果。例如,本装置还可以包括判断模块,用于判断是否有新的波源点产生,若判断为是,则通知荡漾触发模块510或610获取新的波源点;若判断为否,则通知图像生成模块530或630将下一帧区域作为当前帧区域,生成当前帧图像。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,本领域普通技术人员可以理解实现上述实施例的全部或部分流程,并依本发明权利要求所作的等同变化,仍属于发明所涵盖的范围。