ImageProcessor.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. //
  2. // ImageProcessor.swift
  3. // Kingfisher
  4. //
  5. // Created by WANG WEI on 2016/08/26.
  6. // Copyright © 2016年 Wei Wang. All rights reserved.
  7. //
  8. import Foundation
  9. import CoreGraphics
  10. public enum ImageProcessItem {
  11. case image(Image)
  12. case data(Data)
  13. }
  14. public protocol ImageProcessor {
  15. func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image?
  16. }
  17. typealias ProcessorImp = ((ImageProcessItem, KingfisherOptionsInfo) -> Image?)
  18. public extension ImageProcessor {
  19. func append(another: ImageProcessor) -> ImageProcessor {
  20. return GeneralProcessor { item, options in
  21. if let image = self.process(item: item, options: options) {
  22. return another.process(item: .image(image), options: options)
  23. } else {
  24. return nil
  25. }
  26. }
  27. }
  28. }
  29. fileprivate struct GeneralProcessor: ImageProcessor {
  30. let p: ProcessorImp
  31. func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  32. return p(item, options)
  33. }
  34. }
  35. public struct DefaultProcessor: ImageProcessor {
  36. public init() {}
  37. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  38. switch item {
  39. case .image(let image):
  40. return image
  41. case .data(let data):
  42. return Image.kf_image(data: data, scale: options.scaleFactor, preloadAllGIFData: options.preloadAllGIFData)
  43. }
  44. }
  45. }
  46. public struct RoundCornerImageProcessor: ImageProcessor {
  47. public let cornerRadius: CGFloat
  48. public let targetSize: CGSize?
  49. public init(cornerRadius: CGFloat, targetSize: CGSize? = nil) {
  50. self.cornerRadius = cornerRadius
  51. self.targetSize = targetSize
  52. }
  53. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  54. switch item {
  55. case .image(let image):
  56. let size = targetSize ?? image.kf_size
  57. return image.kf_image(withRoundRadius: cornerRadius, fit: size, scale: options.scaleFactor)
  58. case .data(_):
  59. return (DefaultProcessor() |> self).process(item: item, options: options)
  60. }
  61. }
  62. }
  63. public struct ResizingImageProcessor: ImageProcessor {
  64. public let targetSize: CGSize
  65. public init(targetSize: CGSize) {
  66. self.targetSize = targetSize
  67. }
  68. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  69. switch item {
  70. case .image(let image):
  71. return image.kf_resize(to: targetSize)
  72. case .data(_):
  73. return (DefaultProcessor() |> self).process(item: item, options: options)
  74. }
  75. }
  76. }
  77. public struct BlurImageProcessor: ImageProcessor {
  78. public let blurRadius: CGFloat
  79. public init(blurRadius: CGFloat) {
  80. self.blurRadius = blurRadius
  81. }
  82. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  83. switch item {
  84. case .image(let image):
  85. let radius = blurRadius * options.scaleFactor
  86. return image.kf_blurred(withRadius: radius)
  87. case .data(_):
  88. return (DefaultProcessor() |> self).process(item: item, options: options)
  89. }
  90. }
  91. }
  92. public struct OverlayImageProcessor: ImageProcessor {
  93. public let overlay: Color
  94. public let fraction: CGFloat
  95. public init(overlay: Color, fraction: CGFloat = 0.5) {
  96. self.overlay = overlay
  97. self.fraction = fraction
  98. }
  99. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  100. switch item {
  101. case .image(let image):
  102. return image.kf_overlaying(with: overlay, fraction: fraction)
  103. case .data(_):
  104. return (DefaultProcessor() |> self).process(item: item, options: options)
  105. }
  106. }
  107. }
  108. public struct TintImageProcessor: ImageProcessor {
  109. public let tint: Color
  110. public init(tint: Color) {
  111. self.tint = tint
  112. }
  113. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  114. switch item {
  115. case .image(let image):
  116. return image.kf_tinted(with: tint)
  117. case .data(_):
  118. return (DefaultProcessor() |> self).process(item: item, options: options)
  119. }
  120. }
  121. }
  122. public struct ColorControlsProcessor: ImageProcessor {
  123. public let brightness: CGFloat
  124. public let contrast: CGFloat
  125. public let saturation: CGFloat
  126. public let inputEV: CGFloat
  127. public init(brightness: CGFloat, contrast: CGFloat, saturation: CGFloat, inputEV: CGFloat) {
  128. self.brightness = brightness
  129. self.contrast = contrast
  130. self.saturation = saturation
  131. self.inputEV = inputEV
  132. }
  133. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  134. switch item {
  135. case .image(let image):
  136. return image.kf_adjusted(brightness: brightness, contrast: contrast, saturation: saturation, inputEV: inputEV)
  137. case .data(_):
  138. return (DefaultProcessor() |> self).process(item: item, options: options)
  139. }
  140. }
  141. }
  142. public struct BlackWhiteProcessor: ImageProcessor {
  143. public init() {}
  144. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  145. return ColorControlsProcessor(brightness: 0.0, contrast: 1.0, saturation: 0.0, inputEV: 0.7)
  146. .process(item: item, options: options)
  147. }
  148. }
  149. infix operator |>: AdditionPrecedence
  150. public func |>(left: ImageProcessor, right: ImageProcessor) -> ImageProcessor {
  151. return left.append(another: right)
  152. }