2016-01-23 16 views
5

Ich möchte den gesamten Bildschirm meiner iOS-App verwischen, und ich kann UIBlurEffect nicht verwenden, weil ich in der Lage sein möchte, die Unschärfe zu steuern. Ich versuche also, CIGaussianBlur zu verwenden, aber ich habe Probleme mit den Rändern des Bildschirms.Gaußsche Unschärfe im Vollbildmodus

ich einen Screenshot des Bildschirms einnimmt, und dann durch eine CIFilter mit CIGaussianBlur läuft, die CIImage zurück zu UIImage, und Hinzufügen des neuen verschwommenes Bild auf dem Bildschirm zu konvertieren.

Hier ist mein Code:

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) 

Hier ist, was ich sehe:

Gaussian blur applied to screenshot

Es sieht fast richtig außer den Rändern. Es scheint, dass die Unschärfe vom Unschärfe-Radius bis zum Rand zunimmt. Ich habe versucht, mit der Kontextgröße zu spielen, aber es scheint nicht zu funktionieren.

Wie kann ich die Unschärfe bis an die Ränder bringen?

Antwort

11

Es passiert, weil der Gaußsche Unschärfe-Filter Pixel außerhalb der Ränder des Bildes abtastet. Aber weil es keine Pixel gibt, bekommst du dieses seltsame Artefakt. Sie können den Filter "CIAffineClamp" verwenden, um Ihr Bild unendlich in alle Richtungen zu erweitern.

Bitte lesen Sie diese Antwort https://stackoverflow.com/a/18138742/762779

Ich habe versucht, den Code mit gekettet ‚CIAffineClamp-> CIGaussianBlur‘ laufen Filter und bekam gute Ergebnisse.

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

Sie Sir, verdienen eine Art Leistung für diese Antwort .. Es funktionierte wie ein Charme.! Vielen Dank :) – Wiingaard

Verwandte Themen