@@ -11,6 +11,8 @@ import UIKit
1111
1212public struct ImageProcessor {
1313
14+ // MARK: - Interface
15+
1416 public init ( ) { }
1517
1618 // применение фильтра к изображению в главном потоке, не требует явного вызова DispatchQueue.main при работе с UI
@@ -37,6 +39,26 @@ public struct ImageProcessor {
3739 handler: completion)
3840 }
3941
42+ // MARK: - Internal interface
43+
44+ public func processImagesOnThread(
45+ sourceImages: [ UIImage ] ,
46+ filter: ColorFilter ,
47+ qos: QualityOfService ,
48+ completion: @escaping ( [ CGImage ? ] ) -> Void
49+ ) {
50+ let thread = ImageThread ( qos: qos) {
51+ applyFilterOnThread (
52+ sourceImages: sourceImages,
53+ filter: filter,
54+ completion: completion
55+ )
56+ }
57+ thread. start ( )
58+ }
59+
60+ // MARK: - Private func
61+
4062 private func applyFilter(
4163 filter: ColorFilter ,
4264 image: UIImage ,
@@ -84,4 +106,30 @@ public struct ImageProcessor {
84106 handler ( outputImage)
85107 }
86108 }
109+
110+ private func applyFilterOnThread(
111+ sourceImages: [ UIImage ] ,
112+ filter: ColorFilter ,
113+ completion: @escaping ( [ CGImage ? ] ) -> Void
114+ ) {
115+ let context = CIContext ( )
116+ let output = sourceImages. map { image -> CGImage in
117+ guard let source = CIImage ( image: image) else { fatalError ( " Error creating source image " ) }
118+ var params = filter. parameters
119+ params [ ColorFilter . imageKey] = source
120+ guard let filter = CIFilter (
121+ name: filter. filterName,
122+ parameters: params
123+ ) else { fatalError ( " Error creating filter " ) }
124+
125+ guard let filteredImage = filter. outputImage else { fatalError ( " Error filtering image " ) }
126+
127+ guard let outputImage = context. createCGImage (
128+ filteredImage,
129+ from: filteredImage. extent
130+ ) else { fatalError ( " Error creating output image " ) }
131+ return outputImage
132+ }
133+ completion ( output)
134+ }
87135}
0 commit comments