ImageProcessor.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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 func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  37. switch item {
  38. case .image(let image):
  39. return image
  40. case .data(let data):
  41. return Image.kf_image(data: data, scale: options.scaleFactor, preloadAllGIFData: options.preloadAllGIFData)
  42. }
  43. }
  44. }
  45. public struct RoundCornerImageProcessor: ImageProcessor {
  46. public let cornerRadius: CGFloat
  47. public let targetSize: CGSize?
  48. public init(cornerRadius: CGFloat, targetSize: CGSize? = nil) {
  49. self.cornerRadius = cornerRadius
  50. self.targetSize = targetSize
  51. }
  52. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  53. switch item {
  54. case .image(let image):
  55. let size = targetSize ?? image.kf_size
  56. return image.kf_image(withRoundRadius: cornerRadius, fit: size, scale: options.scaleFactor)
  57. case .data(_):
  58. return (DefaultProcessor() |> self).process(item: item, options: options)
  59. }
  60. }
  61. }
  62. public struct ResizingImageProcessor: ImageProcessor {
  63. public let targetSize: CGSize
  64. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  65. switch item {
  66. case .image(let image):
  67. return image.kf_resize(to: targetSize)
  68. case .data(_):
  69. return (DefaultProcessor() |> self).process(item: item, options: options)
  70. }
  71. }
  72. }
  73. public struct BlurImageProcessor: ImageProcessor {
  74. public let blurRadius: CGFloat
  75. public let blurScaling: CGFloat
  76. public init(blurRadius: CGFloat, blurScaling: CGFloat = 1.0) {
  77. self.blurRadius = blurRadius
  78. self.blurScaling = blurScaling
  79. }
  80. public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  81. switch item {
  82. case .image(let image):
  83. let radius = blurRadius * options.scaleFactor
  84. return image.kf_blurred(withRadius: radius)
  85. case .data(_):
  86. return (DefaultProcessor() |> self).process(item: item, options: options)
  87. }
  88. }
  89. }
  90. infix operator |>: DefaultPrecedence
  91. public func |>(left: ImageProcessor, right: ImageProcessor) -> ImageProcessor {
  92. return left.append(another: right)
  93. }