Skip to content

Commit 244966b

Browse files
committed
image processing
1 parent ced4441 commit 244966b

5 files changed

Lines changed: 159 additions & 53 deletions

File tree

Sources/iOSIntPackage/DataProvider.swift

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
//
2+
// Filters.swift
3+
//
4+
//
5+
// Created by Maxim Abakumov on 2020. 12. 02.
6+
//
7+
// Copyright © 2020, Maxim Abakumov. MIT License.
8+
//
9+
10+
import UIKit
11+
12+
public enum ColorFilter {
13+
14+
static let imageKey = kCIInputImageKey
15+
static let radiusKey = kCIInputRadiusKey
16+
static let intensityKey = kCIInputIntensityKey
17+
static let colorKey = kCIInputColorKey
18+
19+
case posterize
20+
case colorInvert
21+
case transfer
22+
case noir
23+
case tonal
24+
case process
25+
case chrome
26+
case fade
27+
case gaussianBlur(radius: Double)
28+
case motionBlur(radius: Double)
29+
case monochrome(color: CIColor, intensity: Double)
30+
case sepia(intensity: Double)
31+
case crystallize(radius: Double)
32+
case bloom(intensity: Double)
33+
case vignette(intensity: Double, radius: Double)
34+
35+
var parameters: [String: Any] {
36+
switch self {
37+
case .posterize,
38+
.colorInvert,
39+
.transfer,
40+
.noir,
41+
.tonal,
42+
.process,
43+
.chrome,
44+
.fade:
45+
return [:]
46+
case .gaussianBlur(radius: let radius):
47+
return [ ColorFilter.radiusKey: radius ]
48+
case .motionBlur(radius: let radius):
49+
return [ ColorFilter.radiusKey: radius ]
50+
case .monochrome(color: let color, intensity: let intensity):
51+
return [
52+
ColorFilter.colorKey: color,
53+
ColorFilter.intensityKey: intensity
54+
]
55+
case .sepia(intensity: let intensity):
56+
return [ ColorFilter.intensityKey: intensity ]
57+
case .crystallize(radius: let radius):
58+
return [ ColorFilter.radiusKey: radius ]
59+
case .bloom(intensity: let intensity):
60+
return [ ColorFilter.intensityKey: intensity ]
61+
case .vignette(intensity: let intensity, radius: let radius):
62+
return [
63+
ColorFilter.intensityKey: intensity,
64+
ColorFilter.radiusKey: radius
65+
]
66+
}
67+
}
68+
69+
var filterName: String {
70+
switch self {
71+
72+
case .gaussianBlur:
73+
return "CIGaussianBlur"
74+
case .motionBlur:
75+
return "CIMotionBlur"
76+
case .monochrome:
77+
return "CIColorMonochrome"
78+
case .posterize:
79+
return "CIColorPosterize"
80+
case .colorInvert:
81+
return "CIColorInvert"
82+
case .sepia:
83+
return "CISepiaTone"
84+
case .transfer:
85+
return "CIPhotoEffectTransfer"
86+
case .noir:
87+
return "CIPhotoEffectNoir"
88+
case .tonal:
89+
return "CIPhotoEffectTonal"
90+
case .process:
91+
return "CIPhotoEffectProcess"
92+
case .chrome:
93+
return "CIPhotoEffectChrome"
94+
case .fade:
95+
return "CIPhotoEffectFade"
96+
case .crystallize:
97+
return "CICrystallize"
98+
case .bloom:
99+
return "CIBloom"
100+
case .vignette:
101+
return "CIVignetteEffect"
102+
}
103+
}
104+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//
2+
// ImageProcessor.swift
3+
//
4+
//
5+
// Created by Maxim Abakumov on 2020. 10. 12.
6+
//
7+
8+
import UIKit
9+
10+
// MARK: - ImageProcessor
11+
12+
public struct ImageProcessor {
13+
14+
public func processImage(
15+
sourceImage: UIImage,
16+
filter: ColorFilter,
17+
completion: (UIImage?) -> Void
18+
) {
19+
applyFilter(
20+
filter: filter,
21+
image: sourceImage,
22+
handler: completion)
23+
}
24+
25+
private func applyFilter(
26+
filter: ColorFilter,
27+
image: UIImage,
28+
handler: (UIImage?) -> Void
29+
) {
30+
let context = CIContext()
31+
guard let source = CIImage(image: image) else { fatalError("Error creating source image") }
32+
var params = filter.parameters
33+
params[ColorFilter.imageKey] = source
34+
guard let filter = CIFilter(
35+
name: filter.filterName,
36+
parameters: params
37+
) else { fatalError("Error creating filter") }
38+
39+
guard let filteredImage = filter.outputImage else { fatalError("Error filtering image") }
40+
41+
guard let outputImage = context.createCGImage(
42+
filteredImage,
43+
from: filteredImage.extent
44+
) else { fatalError("Error creating output image") }
45+
handler(UIImage(cgImage: outputImage))
46+
}
47+
}
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1-
struct iOSIntPackage {
2-
var text = "Hello, Citizen!"
3-
}
1+
//
2+
// iOSIntPackage.swift
3+
//
4+
//
5+
// Created by Maxim Abakumov on 2020. 12. 02.
6+
//
7+
// Copyright © 2020, Maxim Abakumov. MIT License.
8+
//

Tests/iOSIntPackageTests/iOSIntPackageTests.swift

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,4 @@ import XCTest
22
@testable import iOSIntPackage
33

44
final class iOSIntPackageTests: XCTestCase {
5-
func testExample() {
6-
// This is an example of a functional test case.
7-
// Use XCTAssert and related functions to verify your tests produce the correct
8-
// results.
9-
XCTAssertEqual(iOSIntPackage().text, "Hello, World!")
10-
}
11-
12-
static var allTests = [
13-
("testExample", testExample),
14-
]
155
}

0 commit comments

Comments
 (0)