2009-08-31 10 views
8

En mi aplicación para iPhone tengo un UIImage en blanco y negro. Necesito difuminar esa imagen (la falta de definición de Gauss haría).iPhone: Blur UIImage

iPhone sabe claramente cómo desenfocar imágenes, como it does that when it draws shadows.

Sin embargo, no he encontrado nada relacionado con la API.

¿Tengo que hacer borrones a mano, sin aceleración de hardware?

Respuesta

0

Básicamente no hay una API directa para implementar el efecto de desenfoque. Necesita procesar los píxeles para lograr eso.

iPhone dibuja sombras mediante gradiente y no a través de borrosidad.

0

Para desenfocar una imagen, usaría una matriz de convolución. Aquí está el sample code para aplicar una matriz de convolución, y aquí hay un overview of convolution matrices, así como algunas matrices de muestra (incluyendo desenfoque y desenfoque gaussiano).

14

Prueba esto (que se encuentra here):

@interface UIImage (ImageBlur) 
- (UIImage *)imageWithGaussianBlur; 
@end 

@implementation UIImage (ImageBlur) 
- (UIImage *)imageWithGaussianBlur { 
    float weight[5] = {0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162}; 
    // Blur horizontally 
    UIGraphicsBeginImageContext(self.size); 
    [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 
    UIGraphicsBeginImageContext(self.size); 
    [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; 
} 

Y utilizar de esta manera:

UIImage *blurredImage = [originalImage imageWithGaussianBlur]; 

Para obtener más fuerte desenfoque simplemente aplicar este efecto dos veces o más :)