2016-01-23 9 views
5

मैं अपने आईओएस ऐप की पूरी स्क्रीन को धुंधला करना चाहता हूं, और मैं UIBlurEffect का उपयोग नहीं कर सकता क्योंकि मैं धुंध को नियंत्रित करने में सक्षम होना चाहता हूं। तो मैं CIGaussianBlur का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे स्क्रीन के किनारों में परेशानी हो रही है।पूर्ण स्क्रीन पर गॉसियन ब्लर

मैं स्क्रीन के एक स्क्रीनशॉट ले रहा हूँ, और फिर एक CIFilter के माध्यम से यह चल रहा है CIGaussianBlur साथ, UIImage करने के लिए CIImage परिवर्तित वापस, और स्क्रीन के शीर्ष पर नए धुंधला छवि को जोड़ने।

यहाँ मेरी कोड है:

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

संबंधित मुद्दे