vegas una selectivo pro poner parte hacer fondo desenfoque desenfocar desenfocado con como campo borroso aplicar uiimage ios7 cifilter ciimage

uiimage - una - Creando un efecto borroso en iOS7



desenfoque selectivo photoshop (6)

He estado buscando una respuesta a esta pregunta en unas pocas horas ahora, y simplemente no puedo entenderlo. Quiero agregar un efecto de desenfoque gaussiano a la imagen cuando presiono el botón "Botón". El usuario es el que está agregando la imagen.

He creado una acción para el "Botón" basada en fuentes de SO y otros lugares en la web. No funcionará. ¿Qué estoy haciendo mal? Cualquier código sería muy apreciado. Aquí está mi acción "Botón":

- (IBAction)test:(id)sender { CIFilter *gaussianBlurFilter = [CIFilter filterWithName: @"CIGaussianBlur"]; [gaussianBlurFilter setValue:imageView.image forKey: @"inputImage"]; [gaussianBlurFilter setValue:[NSNumber numberWithFloat: 10] forKey: @"inputRadius"]; }

Si necesita algo más que haya hecho para responder la pregunta, hágamelo saber: D


Aquí hay una extensión para desenfoque de imagen en

Swift 3

extension UIImage { public func blurImage(radius: CGFloat) -> UIImage { let inputImage = CIImage(image: self)! let parameters: [String:Any] = [ kCIInputRadiusKey: radius, kCIInputImageKey: inputImage ] let filter = CIFilter(name: "CIGaussianBlur", withInputParameters: parameters)! let cgimg = CIContext().createCGImage(filter.outputImage!, from: inputImage.extent) return UIImage(cgImage: cgimg!) } }


Esto funcionó para mí, sin embargo es lento. Haré la transformación al cargar la aplicación y usaré la imagen una vez transformada en muchos lugares.

Este efecto borroso es para iOS 8.4. Lenguaje rapido

override func viewDidLoad() { super.viewDidLoad() var backgroundImage = self.blurImage(UIImage(named: "background.jpg")!) self.view.backgroundColor = UIColor(patternImage:backgroundImage) } func blurImage(imageToBlur:UIImage) -> UIImage { var gaussianBlurFilter = CIFilter(name: "CIGaussianBlur") gaussianBlurFilter.setValue(CIImage(CGImage: imageToBlur.CGImage), forKey:kCIInputImageKey) var inputImage = CIImage(CGImage: imageToBlur.CGImage) var outputImage = gaussianBlurFilter.outputImage var context = CIContext(options: nil) var cgimg = context.createCGImage(outputImage, fromRect: inputImage.extent()) return UIImage(CGImage: cgimg)! }


La entrada de un CIFilter debe ser un CIImage no un UIImage .


Tres observaciones:

  1. inputImage configurar la inputImage para que sea el CIImage de su UIImage :

    [gaussianBlurFilter setValue:[CIImage imageWithCGImage:[imageView.image CGImage]] forKey:kCIInputImageKey];

  2. No te veo tomando la outputImage , por ejemplo:

    CIImage *outputImage = [gaussianBlurFilter outputImage];

  3. Y presumiblemente desea convertir ese CIImage nuevo en un UIImage .

Entonces, poniendo todo junto:

CIFilter *gaussianBlurFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; [gaussianBlurFilter setDefaults]; CIImage *inputImage = [CIImage imageWithCGImage:[imageView.image CGImage]]; [gaussianBlurFilter setValue:inputImage forKey:kCIInputImageKey]; [gaussianBlurFilter setValue:@10 forKey:kCIInputRadiusKey]; CIImage *outputImage = [gaussianBlurFilter outputImage]; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgimg = [context createCGImage:outputImage fromRect:[inputImage extent]]; // note, use input image extent if you want it the same size, the output image extent is larger UIImage *image = [UIImage imageWithCGImage:cgimg]; CGImageRelease(cgimg);

Alternativamente, si va al código de muestra de WWDC 2013 (se requiere suscripción de desarrollador pagada) y descarga iOS_UIImageEffects , entonces puede tomar la categoría UIImage+ImageEffects . Eso proporciona algunos métodos nuevos:

- (UIImage *)applyLightEffect; - (UIImage *)applyExtraLightEffect; - (UIImage *)applyDarkEffect; - (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor; - (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage;

Por lo tanto, para difuminarlo, dibujarlo y aclararlo (dando ese efecto de "vidrio esmerilado"), puede hacer:

UIImage *newImage = [image applyLightEffect];

Curiosamente, el código de Apple no emplea CIFilter , sino que llama a vImageBoxConvolve_ARGB8888 del marco de procesamiento de imágenes de alto rendimiento vImage .

Esta técnica se ilustra en el video de la WWDC 2013, Implementing Engaging UI en iOS .

Sé que la pregunta era sobre iOS 7, pero ahora en iOS 8 se puede agregar un efecto de desenfoque a cualquier objeto UIBlurEffect con UIBlurEffect :

UIVisualEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; effectView.frame = imageView.bounds; [imageView addSubview:effectView];


Swift 2.0

Hacer una extensión de UIImageView. (Archivo-Nuevo-Archivo-Archivo Swift vacío -Nombrar extensiones.)

import Foundation import UIKit extension UIImageView{ //Method 1 func makeBlurImage(targetImageView:UIImageView?) { let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = targetImageView!.bounds blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] // for supporting device rotation targetImageView?.addSubview(blurEffectView) } //Method 2 func convertToBlurImage(imageToBlur:UIImage) -> UIImage { let gaussianBlurFilter = CIFilter(name: "CIGaussianBlur") gaussianBlurFilter!.setValue(CIImage(CGImage: imageToBlur.CGImage!), forKey:kCIInputImageKey) let initialImage = CIImage(CGImage: imageToBlur.CGImage!) let finalImage = gaussianBlurFilter!.outputImage let finalImagecontext = CIContext(options: nil) let finalCGImage = finalImagecontext.createCGImage(finalImage!, fromRect: initialImage.extent) return UIImage(CGImage: finalCGImage) } }

Uso:

Usando el Método 1:

override func viewDidLoad() { super.viewDidLoad() let sampleImageView = UIImageView(frame: CGRectMake(0, 200, 300, 325)) let sampleImage:UIImage = UIImage(named: "ic_120x120")! sampleImageView.image = sampleImage //Convert To Blur Image Here sampleImageView.makeBlurImage(sampleImageView) self.view.addSubview(sampleImageView) }

Utilizando el Método 2:

override func viewDidLoad() { super.viewDidLoad() let sampleImageView = UIImageView(frame: CGRectMake(0, 200, 300, 325)) let sampleImage:UIImage = UIImage(named: "ic_120x120")! //Convert to Blurred Image Here let sampleImage2 = sampleImageView.convertToBlurImage(sampleImage) sampleImageView.image = sampleImage2 self.view.addSubview(sampleImageView) }


Swift 4 UIImage extensión sin desenvolvimiento de fuerza:

extension UIImage { /// Applies a gaussian blur to the image. /// /// - Parameter radius: Blur radius. /// - Returns: A blurred image. func blur(radius: CGFloat = 6.0) -> UIImage? { let context = CIContext() guard let inputImage = CIImage(image: self) else { return nil } guard let clampFilter = CIFilter(name: "CIAffineClamp") else { return nil } clampFilter.setDefaults() clampFilter.setValue(inputImage, forKey: kCIInputImageKey) guard let blurFilter = CIFilter(name: "CIGaussianBlur") else { return nil } blurFilter.setDefaults() blurFilter.setValue(clampFilter.outputImage, forKey: kCIInputImageKey) blurFilter.setValue(radius, forKey: kCIInputRadiusKey) guard let blurredImage = blurFilter.value(forKey: kCIOutputImageKey) as? CIImage, let cgImage = context.createCGImage(blurredImage, from: inputImage.extent) else { return nil } let resultImage = UIImage(cgImage: cgImage, scale: scale, orientation: imageOrientation) return resultImage } }

Recomiendo encarecidamente desenfocar la imagen en el hilo de fondo:

let image = UIImage(named: "myImage") DispatchQueue.global(qos: .userInitiated).async { let blurredImage = image.blur() DispatchQueue.main.async { self.myImageView.image = blurredImage } }