iOS 5是否支持模糊CoreImage fiters?

lms*_*lms 22 cocoa-touch core-image ios5

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

CIFilter类参考

但根据该设备,它不会:

[CIFilter filterNamesInCategory:kCICategoryBlur];
Run Code Online (Sandbox Code Playgroud)

没有回报.

根据以下内容,我的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
Run Code Online (Sandbox Code Playgroud)

Bra*_*son 31

虽然iOS 5.0上的Core Image缺少模糊滤镜,但仍有一种方法可以获得GPU加速的图像和视频模糊.我的开源GPUImage框架有多种模糊类型,包括Gaussian(使用GPUImageGaussianBlurFilter用于普通Gaussian或GPUImageFastBlurFilter用于硬件优化的9-hit Gaussian),box(使用GPUImageBoxBlurFilter),中位数(使用GPUImageMedianFilter)和a双边模糊(使用GPUImageBilateralBlurFilter).

我在这个答案中描述了用于拉出硬件优化的高斯模糊的着色器,你可以在框架中检查我用于其余部分的代码.这些过滤器运行速度比我尝试过的任何CPU绑定例程快几十倍.

我还将这些模糊结合到多阶段处理效果中,如非锐化掩模,倾斜移位滤波,Canny边缘检测和Harris角点检测,所有这些都可作为此框架中的滤波器使用.


tom*_*oft 25

再次,为了保存所有iOS模糊问题,这是我的贡献:

https://github.com/tomsoft1/StackBluriOS

一个基于Stack Blur的简单模糊库.Stack Blur与Gaussian Blur非常相似,但更快(参见http://incubator.quasimondo.com/processing/fast_blur_deluxe.php)

像这样用它:

UIImage *newIma=[sourceIma stackBlur:radius]
Run Code Online (Sandbox Code Playgroud)

希望这有帮助


Joh*_*hen 24

我也很失望地发现iOS中的Core Image不支持模糊.这是我写的在UIImage上做9抽头高斯模糊的函数.反复调用以获得更强的模糊效果.

@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;
}
Run Code Online (Sandbox Code Playgroud)

只需在现有图像上调用它,如下所示:

UIImage *blurredImage = [originalImage imageWithGaussianBlur9];
Run Code Online (Sandbox Code Playgroud)

并重复它以获得更强的模糊,像这样:

blurredImage = [blurredImage imageWithGaussianBlur9];
Run Code Online (Sandbox Code Playgroud)

  • 伟大的低依赖性解决方案 (5认同)

aka*_*aru 5

不幸的是,它不支持任何模糊.为此,你必须自己动手.