2016-01-23 20 views
5

私はiOSアプリケーションの画面全体をぼかしたいので、ぼやけをコントロールできるようにしたいのでUIBlurEffectを使用できません。だからCIGaussianBlurを使用しようとしていますが、画面の端に問題があります。フルスクリーンでガウスぼかし

私は、画面のスクリーンショットを取り、その後、CIGaussianBlurCIFilterを通してそれを実行し、UIImageCIImage背中を変換し、画面の一番上に新しいぼやけた画像を追加しています。

は、ここに私のコードです:ここで

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

関連する問題