towry
7/13/2017 - 7:05 AM

ImageFilter hold 一个全局的图片处理注册器,可以注册一些图片处理函数。然后ImageFilter数据结构包装一个要处理的图片的信息,通过这个包装方便的对一个图片应用某个filter处理器。

ImageFilter hold 一个全局的图片处理注册器,可以注册一些图片处理函数。然后ImageFilter数据结构包装一个要处理的图片的信息,通过这个包装方便的对一个图片应用某个filter处理器。


import Foundation
#if os(iOS)
import UIKit
#else
public struct UIImage {}
#endif

public struct ImageFilter {
  public typealias Processor = (CGSize, UIImage?) -> UIImage?
  public static var globalProcessors = [String: Processor]()

  fileprivate var name: String = ""
  fileprivate var size: CGSize = .zero

  init(name: String, size: CGSize) {
    self.name = name
    self.size = size
  }
}

extension ImageFilter {
  public static func registerProcessor(_ name: String, _ processor: @escaping ImageFilter.Processor) {
    ImageFilter.globalProcessors[name] = processor
  }

  public static func getProcessor(_ name: String) -> ImageFilter.Processor? {
    return ImageFilter.globalProcessors[name]
  }

  public func process(image: UIImage?) -> UIImage? {
    guard self.name != "" else {
      return nil
    }

    guard let image = image else {
      return nil
    }

    guard self.size.width != 0 && self.size.height != 0 else {
      return nil
    }

    let processor: ImageFilter.Processor? = ImageFilter.getProcessor(self.name)
    return processor?(self.size, image) ?? nil
  }
}

ImageFilter.registerProcessor("circle", { (_, _) -> UIImage? in
  return UIImage()
})

ImageFilter.registerProcessor("scale", { (_, _) -> UIImage? in
  return UIImage()
})

let filter = ImageFilter(name: "circle", size: CGSize(width: 10, height: 10))
let image = filter.process(image: UIImage())
print(image ?? "")