2016-07-11 6 views

ответ

1

Вот такой подход: используйте UIGraphicsGetImageFromCurrentImageContext для создания UIImage, примените к нему фильтр и наложите изображение, содержащее отфильтрованное изображение поверх вашего исходного компонента.

Вот способ сделать это с размытием (taken from my blog):

Getting размытого представления UIView довольно прост: мне нужно, чтобы начать контекст изображения, используйте метод renderInContext слоя вида по для визуализации в контекст, а затем получить UIImage из контекста:

UIGraphicsBeginImageContextWithOptions(CGSize(width: frame.width, height: frame.height), false, 1) 

layer.renderInContext(UIGraphicsGetCurrentContext()!) 

let image = UIGraphicsGetImageFromCurrentImageContext() 


UIGraphicsEndImageContext(); 

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

guard let blur = CIFilter(name: "CIGaussianBlur") else 
{ 
    return 
} 

blur.setValue(CIImage(image: image), forKey: kCIInputImageKey) 
blur.setValue(blurRadius, forKey: kCIInputRadiusKey) 

let ciContext = CIContext(options: nil) 

let result = blur.valueForKey(kCIOutputImageKey) as! CIImage! 

let boundingRect = CGRect(x: -blurRadius * 4, 
    y: -blurRadius * 4, 
    width: frame.width + (blurRadius * 8), 
    height: frame.height + (blurRadius * 8)) 

let cgImage = ciContext.createCGImage(result, fromRect: boundingRect) 


let filteredImage = UIImage(CGImage: cgImage) 

Размытое изображение будет больше, чем его входное изображение, поэтому мне нужно указать размер, который мне нужен, в createCGImage.

Следующий шаг должен добавить UIImageView в мой взгляд и скрыть все остальные виды. Я подклассы UIImageView к BlurOverlay так, что, когда дело доходит до его удаления, я могу быть уверен, что я не вынимая существующий UIImageView:

let blurOverlay = BlurOverlay() 
blurOverlay.frame = boundingRect 

blurOverlay.image = filteredImage 

subviews.forEach{ $0.hidden = true } 


addSubview(blurOverlay) 

Когда дело доходит до ДЭ-размывания, я хочу, чтобы обеспечить последний подтаблицы это одна из моих BlurOverlay удалить его и UNHIDE существующих просмотров:

func unBlur() 
{ 
    if let blurOverlay = subviews.last as? BlurOverlay 
    { 
     blurOverlay.removeFromSuperview() 

     subviews.forEach{ $0.hidden = false } 
    } 

} 

Наконец, чтобы увидеть, если в UIView в настоящее время размыты, мне просто нужно увидеть, если его последняя подтаблицы является BlurOverlay:

var isBlurred: Bool 
{ 
    return subviews.last is BlurOverlay 
} 
+0

Транк вам за ваш ответ. Это именно то, что я хочу сделать. Мне нужно применить фильтр (преобразование перспективы) в MKMapView. Что бы вы порекомендовали сделать тогда. Взаимодействие с пользователем не обязательно должно быть. Я думаю о том, чтобы никогда не добавлять MapView в представление и просто получать изображение, как вы сказали. Однако я буду поворачивать MapView программно, поэтому он должен иметь определенную частоту кадров во время движения. Как я могу получить больше изображений при перемещении вида? – Lenny1357

+0

Если вы хотите повернуть изображение в 3D, почему бы не использовать изображение в качестве диффузного содержимого для материала SceneKit, примененного к плоскости? Если вы хотите анимировать точки перспективного преобразования, посмотрите на «CADisplayLink» (но я думаю, что вы получите более интересные результаты с помощью SceneKit :)). –

+0

Я поворачиваю MapView вокруг географической координаты. И поворот вокруг координаты должен быть показан с применением фильтра. В этом случае простой образ не будет делать трюк. Что вы предложите сделать для того, чтобы показать поворот, который MapView управляет сам по себе с помощью примененного CIFilter? Это похоже на использование CIFilter на видео, но в моем случае это анимация из самого MapView, которую я хочу показать. Мне нужно будет. как PixelBuffer. К сожалению, я думаю, что невозможно установить его для MapView. – Lenny1357

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