O iOS 5 suporta os ajustadores CoreImage?

De acordo com a documentação, ele deve suportar o desfoque, observe o “Disponível no iOS 5.0 e posterior”:

Referência de Classe CIFilter

Mas de acordo com o dispositivo, isso não acontece:

[CIFilter filterNamesInCategory:kCICategoryBlur]; 

não retorna nada.

De acordo com o seguinte, apenas estes filtros estão disponíveis no meu iPhone e Simulator (ambos executando 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 

Infelizmente, ele não suporta nenhum desfoque. Para isso, você terá que rolar o seu próprio.

Embora o Core Image no iOS 5.0 não tenha filtros de desfoque, ainda há uma maneira de obter borrões de imagens e vídeo acelerados por GPU. Meu framework open source GPUImage tem vários tipos de blur, incluindo Gaussian (usando o GPUImageGaussianBlurFilter para um Gaussian geral ou o GPUImageFastBlurFilter para um Gaussian de 9-hit otimizado por hardware), box (usando um GPUImageBoxBlurFilter), median (usando um GPUImageMedianFilter) e um desfoque bilateral (usando um GPUImageBilateralBlurFilter).

Eu descrevo os shaders usados ​​para extrair o Gaussian Blur otimizado por hardware nesta resposta , e você pode examinar o código que eu uso para o resto dentro do framework. Esses filtros são executados dezenas de vezes mais rápido do que qualquer rotina limite da CPU que eu já experimentei.

Também incorporei esses desfoques em efeitos de processamento de vários estágios, como máscara de nitidez, filtragem de mudança de inclinação, detecção de borda Canny e detecção de canto Harris, todos disponíveis como filtros dentro dessa estrutura.

Novamente, em uma tentativa de salvar todos os problemas de desfoque no iOS, aqui está minha contribuição:

https://github.com/tomsoft1/StackBluriOS

Uma biblioteca simples de desfoque baseada no Stack Blur. O Stack Blur é muito semelhante ao Gaussian Blur, mas muito mais rápido (veja http://incubator.quasimondo.com/processing/fast_blur_deluxe.php )

use-o assim:

 UIImage *newIma=[sourceIma stackBlur:radius] 

Espero que esta ajuda

Eu também fiquei desapontado ao descobrir que o Core Image no iOS não suporta desfoques. Aqui está a function que escrevi para fazer um desfoque gaussiano de 9 toques em um UIImage. Chame repetidamente para obter borrões mais fortes.

 @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; } 

Basta ligar para uma imagem existente como esta:

 UIImage *blurredImage = [originalImage imageWithGaussianBlur9]; 

e repita para obter um desfoque mais forte, como este:

 blurredImage = [blurredImage imageWithGaussianBlur9]; 

ATUALIZAÇÃO: A partir do iOS 6 [CIFilter filterNamesInCategory:kCICategoryBlur]; retorna CIGaussianBlur o que significa que este filtro está disponível no dispositivo. Mesmo que isso seja verdade, você (provavelmente) terá melhor desempenho e mais flexibilidade usando o GPUImage.

Aqui está o link para o nosso tutorial sobre como fazer efeito de borrão no aplicativo iOS com diferentes abordagens. http://blog.denivip.ru/index.php/2013/01/blur-effect-in-ios-applications/?lang=en

Se você pode usar o OpenGL ES no seu aplicativo iOS, é assim que você calcula a mediana em um raio de vizinhança de pixels de sua escolha (a mediana é um tipo de desfoque, é claro):

 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)); } 

Uma breve descrição das etapas 1. Calcule a média dos valores dos pixels em torno do pixel de origem em uma vizinhança 3x3; 2. Encontre o valor máximo de pixel de todos os pixels na mesma vizinhança que sejam menores que a média. 3. [OPCIONAL] Subtrair o valor de pixel mediano do valor de pixel de origem para detecção de borda.

Se você estiver usando o valor mediano para a detecção de bordas, há algumas maneiras de modificar o código acima para obter melhores resultados, ou seja, filtragem mediana híbrida e filtragem de mídia truncada (um substituto e uma melhor filtragem de 'modo'). Se você estiver interessado, por favor, pergunte.