2013-10-17 5 views
26

나는 몇 시간 만에이 질문에 대한 해답을 찾고 있었지만 지금은 이해할 수 없습니다. 단추 "단추"를 누를 때 이미지에 가우시안 흐림 효과를 추가하고 싶습니다. 사용자가 이미지를 추가하는 사용자입니다.iOS7에서 흐림 효과 만들기

SO 및 웹의 다른 장소의 출처를 기반으로 "버튼"에 대한 작업을 만들었습니다. 이거 작동 안 할거야. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 모든 코드는 크게 감사하겠습니다. 여기 내 "버튼"작업입니다 :

Here is my UI

답변

72

세 가지 관찰 :

  1. 당신은 일하기 inputImage을 설정하는 데 필요한에서 CIImage 당신의 UIImage :

    :

    [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]; 

흥미롭게도, 애플의 코드가 를 않는 몇 가지 새로운 방법을 제공합니다이 아니라 CIFilter을 사용하고 vImage high-performance image processing frameworkvImageBoxConvolve_ARGB8888을 호출하십시오.

이 기술은 WWDC 2013 비디오 Implementing Engaging UI on iOS에 설명되어 있습니다.


나는 문제는 아이폰 OS 7에 대해 있었는지,하지만 지금은 아이폰 OS 8에 하나 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

코드의 두 번째 마지막 줄인 "Unused variable Image"라는 경고 메시지가 나타납니다. – user2891448

1

D 조 CIFilter 요구 사항의 입력 : 당신은 내가 질문에 대답하기 위해 수행 한 다른 작업을해야하는 경우

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

은 알려 주시기 바랍니다 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 TV에서 –

+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 
    } 
} 
내가보기 엔 배경 스레드에서 이미지를 흐리게하는 것이 좋습니다

:

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