高斯模糊iOS使用比较广泛,动感模糊也是模糊算法中的一种。
动态模糊或运动模糊(motion blur)是静态场景或一系列的图片像电影或是动画中快速移动的物体造成明显的模糊拖动痕迹。算法的原理是对每个像素点的dc,加上一个偏移量,呈现在图片上就是一个像素点被拉伸和迁移。
使用场景及效果如下:

如果需要对图片做动感模糊,比如要对图片做如下处理:
原图:

纹理的交叉线就需要部分就需要用到动感模糊,如果使用的是系统的CoreImage
的话,这里提供一种思路。
自定义一个动感模糊的类,继承自CIFilter
,并在该类初始化的时候,指定模糊算法:
- (CIKernel *)initKernel {
static CIKernel *kernel = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
kernel = [CIKernel kernelWithString:kKernelSource];
});
return kernel;
}
初始化时用到的kKernelSource
实际上是一个模糊算法的string
的C函数。如下:
static NSString * const kKernelSource = @"kernel vec4 motionBlur(sampler image, vec2 velocity, float numSamplesInput) {\
\
int numSamples = int(floor(numSamplesInput));\
vec4 sum = vec4(0.0), avg = vec4(0.0);\
vec2 dc = destCoord(), offset = -velocity;\
\
for (int i=0; i < (numSamples * 2 + 1); i++) {\
sum += sample (image, samplerTransform (image, dc + offset));\
offset += velocity / float(numSamples);\
}\
\
avg = sum / float((numSamples * 2 + 1));\
return avg;\
}\
";
// C函数如下
kernel vec4 motionBlur(sampler image, vec2 velocity, float numSamplesInput) {
int numSamples = int(floor(numSamplesInput));
vec4 sum = vec4(0.0), avg = vec4(0.0);
vec2 dc = destCoord(), offset = -velocity;
for (int i=0; i < (numSamples * 2 + 1); i++) {
sum += sample (image, samplerTransform (image, dc + offset));
offset += velocity / float(numSamples);
}
avg = sum / float((numSamples * 2 + 1));
return avg;
}
为什么是字法串?苹果的注释如下
/* The string argument should contain a program with one kernel.
* On OSX 10.10 and before, this returns a CIKernel object.
* On OSX after 10.10, this returns a CIKernel, CIColorKernel, or CIWarpKernel object.
* On iOS this returns a CIKernel, CIColorKernel, or CIWarpKernel object.
*/
+ (nullable instancetype)kernelWithString:(NSString *)string NS_AVAILABLE(10_10, 8_0);
在给定模糊angle
和image
之后,就可以实现对图片纹理的动感模糊效果了,示例图片中我是将柏林噪点的图进行两个角度的动感模糊得到的。
同样的使用GPUImage
也可以实现类似的动感模糊效果。
网友评论