2013-10-17 21 views
26

Bu soruya bir kaç saat içinde cevap aramaktayım ve bunu anlayamıyorum. "Düğme" düğmesine bastığımda görüntüye bir gauss bulanıklığı efekti eklemek istiyorum. Görüntüyü ekleyen kullanıcıdır.iOS7'de bulanıklık efekti oluşturma

SO düğmelerinin kaynaklarına ve web'deki diğer yerlere bağlı olarak "Düğme" için bir eylem oluşturdum. Çalışmayacak. Neyi yanlış yapıyorum? Herhangi bir kod büyük ölçüde takdir edilecektir. İşte benim "Düğme" eylemdir:

Here is my UI

cevap

72

Üç gözlemler:

  1. Sen olmak inputImage ayarlamanız gerekir dan CIImage senin UIImage:

    :

    [gaussianBlurFilter setValue:[CIImage imageWithCGImage:[imageView.image CGImage]] forKey:kCIInputImageKey]; 
    
  2. Sana örneğin outputImage kapma görmüyorum

    CIImage *outputImage = [gaussianBlurFilter outputImage]; 
    
  3. Ve muhtemelen bu CIImage bir UIImage dönüştürebilirsiniz.

Yani, hepsi bir araya koyarak: Eğer WWDC 2013 sample code (gerekli ücretli geliştirici abonelik) gidip iOS_UIImageEffects indirirseniz

CIFilter *gaussianBlurFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; 
[gaussianBlurFilter setDefaults]; 
CIImage *inputImage = [CIImage imageWithCGImage:[imageView.image CGImage]]; 
[gaussianBlurFilter setValue:inputImage forKey:kCIInputImageKey]; 
[gaussianBlurFilter setValue:@10 forKey:kCIInputRadiusKey]; 

CIImage *outputImage = [gaussianBlurFilter outputImage]; 
CIContext *context = [CIContext contextWithOptions:nil]; 
CGImageRef cgimg  = [context createCGImage:outputImage fromRect:[inputImage extent]]; // note, use input image extent if you want it the same size, the output image extent is larger 
UIImage *image  = [UIImage imageWithCGImage:cgimg]; 
CGImageRelease(cgimg); 

Alternatif olarak, daha sonra UIImage+ImageEffects kategoriyi yakalayabilir. Yani

- (UIImage *)applyLightEffect; 
- (UIImage *)applyExtraLightEffect; 
- (UIImage *)applyDarkEffect; 
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor; 
- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage; 

, bulanıklık ve görüntü ve aydınlatma sonra yapabilirsiniz ("buzlu cam" etkisi olduğunu vererek) için:

UIImage *newImage = [image applyLightEffect]; 

İlginçtir, Apple'ın kod yaptığı birkaç yeni yöntemler sağlar, CIFilter'u kullanır, bunun yerine vImage high-performance image processing framework'un vImageBoxConvolve_ARGB8888 numaralı telefonunu kullanır. Bu teknik, WWDC 2013 videosunda Implementing Engaging UI on iOS belgesinde gösterilmiştir.


Ben soru iOS 7 hakkında olduğunu biliyorum, ama artık iOS 8'de biri UIBlurEffect ile herhangi UIView nesneye bir bulanıklık efekti ekleyebilirsiniz:

UIVisualEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; 
UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];  
effectView.frame = imageView.bounds; 
[imageView addSubview:effectView]; 
+0

sağlar ekimde hangi kodun olmadığını söyle kasımda yazabilirmiyim? Yazdığınız son kod parçası mı? Büyük bir cevap için teşekkürler btw, ve çok fazla anlamadığım için üzgünüm: D – user2891448

+0

Şimdi son düzenlenmiş cevabınızı gördüm, teşekkürler! – user2891448

+0

Bir uyarı alıyorum, "Kullanılmayan Değişken Görüntü" kodunun son satırı olan – user2891448

1

D CIFilter ihtiyaçlarının girişi: Eğer ben soruyu cevaplamak için yapmış başka bir şey gerekiyorsa

- (IBAction)test:(id)sender { 
    CIFilter *gaussianBlurFilter = [CIFilter filterWithName: @"CIGaussianBlur"]; 
    [gaussianBlurFilter setValue:imageView.image forKey: @"inputImage"]; 
    [gaussianBlurFilter setValue:[NSNumber numberWithFloat: 10] forKey: @"inputRadius"]; 
} 

, lütfen bana bildirin CIImage olmak UIImage değil.

4
Bu benim için çalıştı

, ancak yavaş . Uygulama yükleme konusunda dönüşümü yapacağım ve birçok yerde bir kez dönüştürülmüş resmi kullanacağım.

Bu bulanıklık efekti iOS 8.4 içindir. Hızlı dil.

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    var backgroundImage = self.blurImage(UIImage(named: "background.jpg")!) 

    self.view.backgroundColor = UIColor(patternImage:backgroundImage) 
} 

func blurImage(imageToBlur:UIImage) -> UIImage 
{ 
    var gaussianBlurFilter = CIFilter(name: "CIGaussianBlur") 
    gaussianBlurFilter.setValue(CIImage(CGImage: imageToBlur.CGImage), forKey:kCIInputImageKey) 

    var inputImage = CIImage(CGImage: imageToBlur.CGImage) 

    var outputImage = gaussianBlurFilter.outputImage 
    var context = CIContext(options: nil) 
    var cgimg = context.createCGImage(outputImage, fromRect: inputImage.extent()) 

    return UIImage(CGImage: cgimg)! 
} 
+1

Çok ilginç .. ama aynı zamanda çok yavaş ..:/ En azından Apple TV'de –

+0

Evet, yavaş: /. "OnDemand" bulanıklığı yapabilir, bu yardımcı olabilir veya uygulama yüklemede biraz varsa, blurImage işlevini çağırın. Bir noktada bulanık görüntüleri kaydettim, bu yüzden onlara ihtiyacım olduğunda onları bellekten veya başka bir yerden yükleyebilirim. Umarım bu size yardımcı olur veya doğru yönde yönlendirir :))) –

0

Swift 2.0

UIImageView bir uzantısı olun. (Dosya-Yeni-Dosya-boşalt Swift Dosya o Uzantıları ismi.)

import Foundation 
import UIKit 

extension UIImageView{ 

//Method 1 
func makeBlurImage(targetImageView:UIImageView?) 
{ 
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) 
    let blurEffectView = UIVisualEffectView(effect: blurEffect) 
    blurEffectView.frame = targetImageView!.bounds 

    blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] // for supporting device rotation 
    targetImageView?.addSubview(blurEffectView) 
} 
//Method 2 
func convertToBlurImage(imageToBlur:UIImage) -> UIImage 
{ 
    let gaussianBlurFilter = CIFilter(name: "CIGaussianBlur") 
    gaussianBlurFilter!.setValue(CIImage(CGImage: imageToBlur.CGImage!), forKey:kCIInputImageKey) 

    let initialImage = CIImage(CGImage: imageToBlur.CGImage!) 

    let finalImage = gaussianBlurFilter!.outputImage 
    let finalImagecontext = CIContext(options: nil) 

    let finalCGImage = finalImagecontext.createCGImage(finalImage!, fromRect: initialImage.extent) 
    return UIImage(CGImage: finalCGImage) 
} 
} 

Kullanımı:

Yöntem 1 kullanarak: Yöntem 2 Kullanarak

override func viewDidLoad() { 
    super.viewDidLoad() 

    let sampleImageView = UIImageView(frame: CGRectMake(0, 200, 300, 325)) 
    let sampleImage:UIImage = UIImage(named: "ic_120x120")! 
    sampleImageView.image = sampleImage 

    //Convert To Blur Image Here 
    sampleImageView.makeBlurImage(sampleImageView) 

    self.view.addSubview(sampleImageView) 
} 

:

override func viewDidLoad() { 
     super.viewDidLoad() 

     let sampleImageView = UIImageView(frame: CGRectMake(0, 200, 300, 325)) 
     let sampleImage:UIImage = UIImage(named: "ic_120x120")! 

     //Convert to Blurred Image Here 
     let sampleImage2 = sampleImageView.convertToBlurImage(sampleImage) 
     sampleImageView.image = sampleImage2 

     self.view.addSubview(sampleImageView) 
    } 
0

adresinde görüntü bulanıklığı için bir uzantı var

Swift 3

extension UIImage { 

    public func blurImage(radius: CGFloat) -> UIImage { 

     let inputImage = CIImage(image: self)! 

     let parameters: [String:Any] = [ 
      kCIInputRadiusKey: radius, 
      kCIInputImageKey: inputImage 
     ] 
     let filter = CIFilter(name: "CIGaussianBlur", 
           withInputParameters: parameters)! 

     let cgimg = CIContext().createCGImage(filter.outputImage!, from: inputImage.extent) 
     return UIImage(cgImage: cgimg!) 
    } 

} 
0

Swift 4UIImage kuvvet unwrapping olmadan uzantısı:

extension UIImage { 
    /// Applies a gaussian blur to the image. 
    /// 
    /// - Parameter radius: Blur radius. 
    /// - Returns: A blurred image. 
    func blur(radius: CGFloat = 6.0) -> UIImage? { 
     let context = CIContext() 
     guard let inputImage = CIImage(image: self) else { return nil } 

     guard let clampFilter = CIFilter(name: "CIAffineClamp") else { return nil } 
     clampFilter.setDefaults() 
     clampFilter.setValue(inputImage, forKey: kCIInputImageKey) 

     guard let blurFilter = CIFilter(name: "CIGaussianBlur") else { return nil } 
     blurFilter.setDefaults() 
     blurFilter.setValue(clampFilter.outputImage, forKey: kCIInputImageKey) 
     blurFilter.setValue(radius, forKey: kCIInputRadiusKey) 

     guard let blurredImage = blurFilter.value(forKey: kCIOutputImageKey) as? CIImage, 
      let cgImage = context.createCGImage(blurredImage, from: inputImage.extent) else { return nil } 

     let resultImage = UIImage(cgImage: cgImage, scale: scale, orientation: imageOrientation) 
     return resultImage 
    } 
} 
ederim arka plan iş parçacığı üzerinde görüntüyü bulanıklaşmaya tavsiye

:

let image = UIImage(named: "myImage") 
DispatchQueue.global(qos: .userInitiated).async { 
    let blurredImage = image.blur() 
    DispatchQueue.main.async { 
     self.myImageView.image = blurredImage 
    } 
}