2016-01-23 77 views
5

我想模糊我的iOS應用程序的整個屏幕,並且我不能使用UIBlurEffect,因爲我希望能夠控制模糊。所以我試圖使用CIGaussianBlur,但我遇到了屏幕邊緣的問題。全屏高斯模糊

我走了屏幕截圖,然後用CIGaussianBlur運行它通過CIFilter,轉換CIImage回到UIImage,並在屏幕上方加入了新的模糊圖像。

這裏是我的代碼:

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) 

這是我所看到的:

Gaussian blur applied to screenshot

它看起來差不多吧,除了邊緣。看起來,模糊半徑到邊緣的模糊正在消失。我嘗試使用上下文大小,但似乎無法使其工作。

如何讓模糊一直走到邊緣?

回答

11

這是因爲高斯模糊濾波器對圖像邊緣以外的像素採樣。但是因爲沒有像素,你會得到這個奇怪的人造物。您可以使用"CIAffineClamp"過濾器在各個方向無限擴展您的圖像。

請參閱此答案https://stackoverflow.com/a/18138742/762779

我試着用鏈「CIAffineClamp-> CIGaussianBlur」過濾器運行你的代碼,並取得了良好的效果。

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

你先生,該答案應該得到某種成就..它的工作就像一個魅力。謝謝 :) – Wiingaard