2013-10-17 15 views
26

私は数時間でこの質問の答えを探していましたが、わかりません。私はボタン "ボタン"を押すと画像にガウスのぼかし効果を追加したいと思います。ユーザーはイメージを追加するユーザーです。iOS7でぼかし効果を作成する

私はSOや他の場所からのソースに基づいて "ボタン"のアクションを作成しました。うまくいかないだろう。私は間違って何をしていますか?どんなコードでも大変感謝しています。ここに私の「ボタン」アクションです:

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

あなたは、私が質問に答えるために行っている何かが必要な場合は、私に知らせてください:D

Here is my UI

答えて

72

三人の観察:

  1. あなたはUIImageからCIImageするinputImageを設定する必要があります。

    [gaussianBlurFilter setValue:[CIImage imageWithCGImage:[imageView.image CGImage]] forKey:kCIInputImageKey]; 
    
  2. 私は例えば、あなたがoutputImageをつかん表示されません。

    CIImage *outputImage = [gaussianBlurFilter outputImage]; 
    
  3. そしておそらくCIImageUIImageに戻したいと思うでしょう。

だから、そのすべて一緒に入れて:あなたはWWDC 2013 sample code(必要な有料の開発者向けサブスクリプション)に移動し、iOS_UIImageEffectsをダウンロードした場合

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); 

はまた、あなたがしてUIImage+ImageEffectsカテゴリをつかむことができます。あなたが行うことができます(つまり、「曇りガラス」効果を与える)ぼかすので

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

、および画像と、それを明るく:それはいくつかの新しい方法を提供

UIImage *newImage = [image applyLightEffect]; 

興味深いことに、Appleのコードがを行いますではなくCIFilterを使用しますが、vImage high-performance image processing frameworkvImageBoxConvolve_ARGB8888を呼び出します。

この手法は、WWDC 2013ビデオImplementing Engaging UI on iOSに示されています。私は質問がiOSの7についてだったけど、今のiOS 8に1がUIBlurEffectで任意のUIViewオブジェクトにぼかし効果を追加することができます


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

ができ私はibactionのコードを持っていないと言う、どのexca tcly私は私のibactionで書くだろうか?あなたが書いたコードの最後の部分ですか?素晴らしい返信をお寄せいただきありがとうございます。ご迷惑をおかけして申し訳ございません。D – user2891448

+0

最後に編集した回答をお見逃しなく! – user2891448

+0

コードの2番目の最後の行である「未使用の変数Image」という警告が表示されます – user2891448

1

CIFilterニーズの入力CIImageではなく、UIImageとなります。

4

これは私のために働いたが、しかしそれは遅いです。私は、アプリケーションの読み込み時に変換を行い、一度変換された画像を多くの場所で使用します。

このぼかし効果は、iOS 8.4用です。迅速な言語。

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

非常に面白いですが、また非常に遅い..:/ 少なくともAppleのテレビで –

+0

はいそれは遅いです:/。あなたは "onDemand"ぼかしを行うことができます。それは助けになるかもしれません。もしあなたがアプリを読み込んでいるなら、blurImage関数を呼び出してください。ある時点ではぼやけた画像を保存していましたので、必要なときに関数を呼び出すのではなく、メモリや他の場所から読み込むことができます。これが役立ち、正しい方向にあなたを指してくれることを願って:))) –

0

スウィフト2.0

UIImageViewの拡張を行います。 (ファイル・新ファイル・空スウィフトファイルは拡張子を-name。)

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) 
} 
} 

用途:

方法1を使用した:方法2を使用して

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

画像のぼかしの拡張子は次のとおりです

スウィフト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

スイフト4UIImage力アンラップすることなく拡張:

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 
    } 
} 

Iは非常にバックグラウンドスレッドで画像をぼかすことをお勧めします:

let image = UIImage(named: "myImage") 
DispatchQueue.global(qos: .userInitiated).async { 
    let blurredImage = image.blur() 
    DispatchQueue.main.async { 
     self.myImageView.image = blurredImage 
    } 
} 
関連する問題