2016-01-23 21 views
5

iOS uygulamasının tüm ekranını bulanıklaştırmak istiyorum ve UIBlurEffect kullanamıyorum çünkü bulanıklığı kontrol edebilmek istiyorum. Yani CIGaussianBlur kullanmayı deniyorum, ancak ekranın kenarlarında sorun yaşıyorum.Gaussian tam ekranda bulanıklık

Ben ekranın bir ekran görüntüsü alma ve ardından UIImage geri CIImage dönüştürerek, CIGaussianBlur ile CIFilter akıtarak ve ekranın üst kısmındaki yeni bulanık görüntüyü ekliyorum. İşte

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) 

gördüklerimi geçerli::

İşte benim kod

Gaussian blur applied to screenshot

Neredeyse sağ kenarları hariç görünüyor. Bulanıklık, bulanıklık yarıçapından kenara doğru gidiyor gibi görünüyor. Bağlam boyutuyla oynamayı denedim, ancak çalışmasını sağlayamadım.

Bulanıklığı kenarlara kadar nasıl açabilirim?

cevap

11

Gauss Bulanıklığı filtresi, görüntünün kenarlarının dışındaki pikselleri örneklediği için oluyor. Ancak piksel olmadığından, bu garip eseri elde edersiniz. Resminizi sonsuza kadar tüm yönlere "uzatmak" için "CIAffineClamp" filtresini kullanabilirsiniz.

ben zincirlenmiş 'CIAffineClamp-> CIGaussianBlur' filtrelerle kodunuzu çalıştıran çalıştı ve iyi sonuçlar aldık bu cevabı https://stackoverflow.com/a/18138742/762779

bakınız.

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

Siz efendim, bu cevap için bir çeşit başarıyı hakedin .. Bir çekicilik gibi çalıştı! Teşekkür ederim :) – Wiingaard

İlgili konular