@@ -13,6 +13,7 @@ public struct ImageProcessor {
1313
1414 public init ( ) { }
1515
16+ // применение фильтра к изображению в главном потоке, не требует явного вызова DispatchQueue.main при работе с UI
1617 public func processImage(
1718 sourceImage: UIImage ,
1819 filter: ColorFilter ,
@@ -24,6 +25,18 @@ public struct ImageProcessor {
2425 handler: completion)
2526 }
2627
28+ // применение фильтра к изображению в параллельном потоке, требует явного вызова DispatchQueue.main при работе с UI
29+ public func processImageAsync(
30+ sourceImage: UIImage ,
31+ filter: ColorFilter ,
32+ completion: @escaping ( CGImage ? ) -> Void
33+ ) {
34+ applyFilterAsync (
35+ filter: filter,
36+ image: sourceImage,
37+ handler: completion)
38+ }
39+
2740 private func applyFilter(
2841 filter: ColorFilter ,
2942 image: UIImage ,
@@ -46,4 +59,29 @@ public struct ImageProcessor {
4659 ) else { fatalError ( " Error creating output image " ) }
4760 handler ( UIImage ( cgImage: outputImage) )
4861 }
62+
63+ private func applyFilterAsync(
64+ filter: ColorFilter ,
65+ image: UIImage ,
66+ handler: @escaping ( CGImage ? ) -> Void
67+ ) {
68+ DispatchQueue . global ( qos: . userInitiated) . async {
69+ let context = CIContext ( )
70+ guard let source = CIImage ( image: image) else { fatalError ( " Error creating source image " ) }
71+ var params = filter. parameters
72+ params [ ColorFilter . imageKey] = source
73+ guard let filter = CIFilter (
74+ name: filter. filterName,
75+ parameters: params
76+ ) else { fatalError ( " Error creating filter " ) }
77+
78+ guard let filteredImage = filter. outputImage else { fatalError ( " Error filtering image " ) }
79+
80+ guard let outputImage = context. createCGImage (
81+ filteredImage,
82+ from: filteredImage. extent
83+ ) else { fatalError ( " Error creating output image " ) }
84+ handler ( outputImage)
85+ }
86+ }
4987}
0 commit comments