iOS 5是否支持模糊的CoreImagefunction?

根据文档,它应该支持模糊,请注意“在iOS 5.0及更高版本中可用”:

CIFilter类参考

但根据设备,它不会:

[CIFilter filterNamesInCategory:kCICategoryBlur]; 

什么也不返回

根据以下只有这些filter可在我的iPhone和模拟器(都运行5.0):

 [CIFilter filterNamesInCategory:kCICategoryBuiltIn] CIAdditionCompositing, CIAffineTransform, CICheckerboardGenerator, CIColorBlendMode, CIColorBurnBlendMode, CIColorControls, CIColorCube, CIColorDodgeBlendMode, CIColorInvert, CIColorMatrix, CIColorMonochrome, CIConstantColorGenerator, CICrop, CIDarkenBlendMode, CIDifferenceBlendMode, CIExclusionBlendMode, CIExposureAdjust, CIFalseColor, CIGammaAdjust, CIGaussianGradient, CIHardLightBlendMode, CIHighlightShadowAdjust, CIHueAdjust, CIHueBlendMode, CILightenBlendMode, CILinearGradient, CILuminosityBlendMode, CIMaximumCompositing, CIMinimumCompositing, CIMultiplyBlendMode, CIMultiplyCompositing, CIOverlayBlendMode, CIRadialGradient, CISaturationBlendMode, CIScreenBlendMode, CISepiaTone, CISoftLightBlendMode, CISourceAtopCompositing, CISourceInCompositing, CISourceOutCompositing, CISourceOverCompositing, CIStraightenFilter, CIStripesGenerator, CITemperatureAndTint, CIToneCurve, CIVibrance, CIVignette, CIWhitePointAdjust 

不幸的是,它不支持任何模糊。 为此,你将不得不推出自己的。

虽然iOS 5.0上的Core Image缺乏模糊滤镜,但仍然有一种方法可以获得GPU加速的图像和video模糊。 我的开放源代码GPUImage框架有多种模糊types,包括高斯(GPUImageGaussianBlurFilter用于一般的高斯,GPUImageFastBlurFilter用于硬件优化的9点高斯),框(使用GPUImageBoxBlurFilter),中值(使用GPUImageMedianFilter)和双边模糊(使用GPUImageBilateralBlurFilter)。

我在这个答案中描述了用于提取硬件优化的高斯模糊的着色器,您可以在框架内检查剩余的代码。 这些filter比我尝试过的任何CPU绑定例程运行速度快几十倍。

我还将这些模糊处理纳入了多级处理效果,如非锐化遮罩,倾斜移位滤波,Canny边缘检测和Harrisangular点检测,所有这些都可在此框架中用作滤镜。

再次,为了保存所有的iOS模糊图片,以下是我的贡献:

https://github.com/tomsoft1/StackBluriOS

基于Stack模糊的简单模糊库。 Stack Blur与高斯模糊非常相似,但速度更快(请参阅http://incubator.quasimondo.com/processing/fast_blur_deluxe.php

像这样使用它:

 UIImage *newIma=[sourceIma stackBlur:radius] 

希望这个帮助

我也很失望地发现iOS中的Core Image不支持模糊。 这是我写的在UIImage上做9抽头高斯模糊的function。 多次调用以获得更强的模糊。

 @interface UIImage (ImageBlur) - (UIImage *)imageWithGaussianBlur9; @end @implementation UIImage (ImageBlur) - (UIImage *)imageWithGaussianBlur9 { float weight[5] = {0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162}; // Blur horizontally UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[0]]; for (int x = 1; x < 5; ++x) { [self drawInRect:CGRectMake(x, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[x]]; [self drawInRect:CGRectMake(-x, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[x]]; } UIImage *horizBlurredImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // Blur vertically UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); [horizBlurredImage drawInRect:CGRectMake(0, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[0]]; for (int y = 1; y < 5; ++y) { [horizBlurredImage drawInRect:CGRectMake(0, y, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[y]]; [horizBlurredImage drawInRect:CGRectMake(0, -y, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[y]]; } UIImage *blurredImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // return blurredImage; } 

只需要在现有的图像上调用它:

 UIImage *blurredImage = [originalImage imageWithGaussianBlur9]; 

并重复它以获得更强的模糊,如下所示:

 blurredImage = [blurredImage imageWithGaussianBlur9]; 

更新:从iOS 6 [CIFilter filterNamesInCategory:kCICategoryBlur]; 返回CIGaussianBlur表示该filter在设备上可用。 即使这是真的,你(可能)会使用GPUImage获得更好的性能和更大的灵活性。

这里是我们的教程在iOS应用程序中使用不同方法制作模糊效果的链接。 http://blog.denivip.ru/index.php/2013/01/blur-effect-in-ios-applications/?lang=en

如果您可以在iOS应用程序中使用OpenGL ES,则可以这样计算所选像素邻域半径的​​中位数(当然,中位数是一种模糊):

 kernel vec4 medianUnsharpKernel(sampler u) { vec4 pixel = unpremultiply(sample(u, samplerCoord(u))); vec2 xy = destCoord(); int radius = 3; int bounds = (radius - 1) / 2; vec4 sum = vec4(0.0); for (int i = (0 - bounds); i <= bounds; i++) { for (int j = (0 - bounds); j <= bounds; j++ ) { sum += unpremultiply(sample(u, samplerTransform(u, vec2(xy + vec2(i, j))))); } } vec4 mean = vec4(sum / vec4(pow(float(radius), 2.0))); float mean_avg = float(mean); float comp_avg = 0.0; vec4 comp = vec4(0.0); vec4 median = mean; for (int i = (0 - bounds); i <= bounds; i++) { for (int j = (0 - bounds); j <= bounds; j++ ) { comp = unpremultiply(sample(u, samplerTransform(u, vec2(xy + vec2(i, j))))); comp_avg = float(comp); median = (comp_avg < mean_avg) ? max(median, comp) : median; } } return premultiply(vec4(vec3(abs(pixel.rgb - median.rgb)), 1.0)); } 

步骤简要说明1.计算3×3邻域中源像素周围像素值的平均值; 2.find同一邻域内所有像素的最大像素值,均小于平均值。 3. [可选]从源像素值中减去边缘检测的中间像素值。

如果使用边缘检测的中值,有两种方法可以修改上述代码以获得更好的结果,即混合中值滤波和截断媒体滤波(替代和更好的“模式”滤波)。 如果你有兴趣,请询问。