2016-01-23 39 views
5

Voglio sfocare l'intero schermo della mia app iOS, e non posso usare UIBlurEffect perché voglio essere in grado di controllare la sfocatura. Quindi sto cercando di usare CIGaussianBlur, ma ho problemi con i bordi dello schermo.Sfocatura gaussiana a schermo intero

mi sto prendendo uno screenshot dello schermo, e quindi eseguire attraverso un CIFilter con CIGaussianBlur, convertendo il CIImage torna a UIImage, e aggiungendo la nuova immagine sfocata sulla parte superiore dello schermo.

Ecco il mio codice:

let layer = UIApplication.sharedApplication().keyWindow?.layer 
    UIGraphicsBeginImageContext(view.frame.size) 

    layer!.renderInContext(UIGraphicsGetCurrentContext()!) 
    let screenshot = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    let blurRadius = 5 
    var ciimage: CIImage = CIImage(image: screenshot)! 
    var filter: CIFilter = CIFilter(name:"CIGaussianBlur")! 
    filter.setDefaults() 
    filter.setValue(ciimage, forKey: kCIInputImageKey) 
    filter.setValue(blurRadius, forKey: kCIInputRadiusKey) 

    let ciContext = CIContext(options: nil) 
    let result = filter.valueForKey(kCIOutputImageKey) as! CIImage! 
    let cgImage = ciContext.createCGImage(result, fromRect: view.frame) 

    let finalImage = UIImage(CGImage: cgImage) 


    let blurImageView = UIImageView(frame: view.frame) 
    blurImageView.image = finalImage 
    blurImageView.sizeToFit() 
    blurImageView.contentMode = .ScaleAspectFit 
    blurImageView.center = view.center 
    view.addSubview(blurImageView) 

Ecco quello che vedo:

Gaussian blur applied to screenshot

sembra quasi diritto a meno che i bordi. Sembra che la sfocatura stia decollando dal raggio di sfocatura verso il bordo. Ho provato a giocare con le dimensioni del contesto ma non riesco a farlo funzionare.

Come posso rendere la sfocatura fino ai bordi?

risposta

11

Sta succedendo perché il filtro sfocatura gaussiana campiona i pixel all'esterno dei bordi dell'immagine. Ma poiché non ci sono pixel, ottieni questo strano artefatto. Puoi utilizzare il filtro "CIAffineClamp" per "estendere" l'immagine all'infinito in tutte le direzioni.

Si prega di vedere questa risposta https://stackoverflow.com/a/18138742/762779

Ho provato a fare funzionare il codice con 'CIAffineClamp-> CIGaussianBlur' filtri incatenati e ottenuto buoni risultati.

let layer = UIApplication.sharedApplication().keyWindow?.layer 
UIGraphicsBeginImageContext(view.frame.size) 

layer!.renderInContext(UIGraphicsGetCurrentContext()!) 
let screenshot = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

let blurRadius = 5 
let ciimage: CIImage = CIImage(image: screenshot)! 

// Added "CIAffineClamp" filter 
let affineClampFilter = CIFilter(name: "CIAffineClamp")! 
affineClampFilter.setDefaults() 
affineClampFilter.setValue(ciimage, forKey: kCIInputImageKey) 
let resultClamp = affineClampFilter.valueForKey(kCIOutputImageKey) 

// resultClamp is used as input for "CIGaussianBlur" filter 
let filter: CIFilter = CIFilter(name:"CIGaussianBlur")! 
filter.setDefaults() 
filter.setValue(resultClamp, forKey: kCIInputImageKey) 
filter.setValue(blurRadius, forKey: kCIInputRadiusKey) 


let ciContext = CIContext(options: nil) 
let result = filter.valueForKey(kCIOutputImageKey) as! CIImage! 
let cgImage = ciContext.createCGImage(result, fromRect: ciimage.extent) // changed to ciiimage.extend 

let finalImage = UIImage(CGImage: cgImage) 

let blurImageView = UIImageView(frame: view.frame) 
blurImageView.image = finalImage 
blurImageView.sizeToFit() 
blurImageView.contentMode = .ScaleAspectFit 
blurImageView.center = view.center 
view.addSubview(blurImageView) 
+0

Tu Signore, meriti un qualche tipo di risultato per quella risposta .. Ha funzionato come un fascino.! Grazie :) – Wiingaard