2016-12-22 18 views
1

Я хотел, чтобы захватить снимок небольшой области экрана и применить размытие к нему - хотя и на 60fps - что невозможно с этим кодом:Более эффективный способ размывания небольшой части UIView?

let rectangle = CGRect(x: -37, y: -153, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) 

captureSnapShotWithGaussianBlur(rect: rectangle) 

public func captureSnapShotWithGaussianBlur(rect: CGRect) -> UIImage { 

     let SCREEN_SIZE_SCALE_FACTOR = UIScreen.main.scale 
     let CROPPING_RECT = CGRect(x: 0, y: 0, width: 118*SCREEN_SIZE_SCALE_FACTOR, height: 66*SCREEN_SIZE_SCALE_FACTOR) 

     UIGraphicsBeginImageContextWithOptions(CGSize(width: 118, height: 66), true, 0.0) 

     backgroundView!.drawHierarchy(in: rect, afterScreenUpdates: true) 

     let capturedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     let ciimage: CIImage = CIImage(image: capturedImage)! 

     UIGraphicsEndImageContext() 

     let gaussianfilter: CIFilter = CIFilter(name:"CIGaussianBlur")! 
     gaussianfilter.setDefaults() 
     gaussianfilter.setValue(ciimage, forKey: kCIInputImageKey) 
     gaussianfilter.setValue(10, forKey: kCIInputRadiusKey) 

     let outputImage: CIImage = gaussianfilter.outputImage! 
     let finalImage: UIImage = UIImage(ciImage: outputImage.cropping(to: CROPPING_RECT), scale: SCREEN_SIZE_SCALE_FACTOR, orientation: UIImageOrientation.up) 

     return finalImage 

} 

Одна из проблем, я вижу, с моим что я думаю, что Gaussian Blur применяется ко всему изображению (из-за UIScreen.main.bounds, используемых для прямоугольника drawHierarchy).

Я надеялся, что был способ сделать resizableSnapshotView() экрана, а затем сделать drawHierarchy в этом представлении и извлечь изображение - увы, это не сработает (хотя это похоже на симулятор, но не на телефон, где он просто делает черный).

Любые предложения о том, как сделать более эффективный метод захвата и размытия?

Cheers!

+0

с помощью Вы встроенная функции моментальных снимков, когда вы упомянули пытаетесь это первый мгновенными снимками? – SeanLintern88

+0

Да, я пробовал много комбинаций методов с использованием встроенных методов моментальных снимков, а затем пытался использовать содержимое этого для создания изображения для размытия - безрезультатно. Методы моментальных снимков отлично работают в симуляторе, но отображаются на черном на самом телефоне. Apple - в документах - говорит использовать drawHierarchy для применения эффектов размытия и т. Д. Тем не менее, я просто хочу, чтобы можно было выбрать область экрана и применить размытие до менее чем за 1/60 секунды. –

ответ

0

Попробуйте использовать это расширение, чтобы снимок вида и размыть это, кажется, работает на оба Тренажер и устройство:

extenstion UIView { 
    /// A more efficient way to snapshot a UIView other than UIView.snapshot 
/// 
/// - Returns: UIImage representing the snapshot of the UIView 
public func snapshotImage() -> UIImage? { 
    UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0) 
    drawHierarchy(in: bounds, afterScreenUpdates: false) 
    let snapshotImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return snapshotImage 
} 

public func snapshotView() -> UIView? { 
    if let snapshotImage = snapshotImage() { 
     return UIImageView(image: snapshotImage) 
    } else { 
     return nil 
    } 
} 
} 
+0

Спасибо, Шон, в то время как это намного более многоразово, чем мой код, есть ли существенная разница, которая повлияет на производительность? Из того, что я вижу, оба вызывают точно такие же методы и делают одно и то же - не будучи более результативными. Я должен был использовать более эффективный, чем более эффективный. Еще раз спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^