Why
- Core Image 是一個強大的圖像處理框架,但是它的 API 有時可能略顯笨拙
- Core Image 的 API 是弱類型的 —— 我們通過鍵值編碼 (KVC) 來配置圖像濾鏡 (filter)
- 在使用參數(shù)的類型或名字時,我們都使用字符串來進(jìn)行表示,這十分容易出錯,極有可能導(dǎo)致運行時錯誤
Method & Advantage
Method
對 CIImage 延展開發(fā)新的 API
Advantage
避免這些運行時錯誤一忱,最終得到一組類型安全的 API
Usage
效果圖
調(diào)用代碼
if let url = URL(string: "https://via.placeholder.com/300x180/62abe4/ffffff?text=Core+Image"), let image = CIImage(contentsOf: url) {
// 原圖
coreImageViews[0].image = UIImage(ciImage: image)
// 高斯模糊濾鏡
coreImageViews[1].image = UIImage(ciImage: image.blurred(radius: 2))
// 顏色生成濾鏡
let color = UIColor.orange.withAlphaComponent(0.4)
coreImageViews[2].image = UIImage(ciImage: image.generated(color: color))
// 圖像覆蓋合成濾鏡(自己實現(xiàn))
coreImageViews[3].image = UIImage(ciImage: image.generated(color: color).compositeSource(over: image))
// 圖像覆蓋合成濾鏡(系統(tǒng)自帶)
coreImageViews[4].image = UIImage(ciImage: image.generated(color: color).composited(over: image))
// 顏色疊層濾鏡
let yellow = UIColor.yellow.withAlphaComponent(0.4)
coreImageViews[5].image = UIImage(ciImage: image.overlaid(color: yellow))
}
Implementation
1、高斯模糊濾鏡(CIGaussianBlur)
// 1.高斯模糊濾鏡(CIGaussianBlur)
public func blurred(radius: Double) -> CIImage {
let parameters: [String: Any] = [
kCIInputRadiusKey: radius,
kCIInputImageKey: self
]
guard let filter = CIFilter(name: "CIGaussianBlur", parameters: parameters) else {
fatalError("CIGaussianBlur filter creation failed!")
}
guard let outputImage = filter.outputImage else {
fatalError("CIGaussianBlur outputImage generation failed!")
}
return outputImage
}
2、顏色生成濾鏡(CIConstantColorGenerator)
// 2.顏色生成濾鏡(CIConstantColorGenerator)
public func generated(color: UIColor) -> CIImage {
let parameters: [String: Any] = [
kCIInputColorKey: CIColor(cgColor: color.cgColor)
]
guard let filter = CIFilter(name: "CIConstantColorGenerator", parameters: parameters) else {
fatalError("CIConstantColorGenerator filter creation failed!")
}
guard let outputImage = filter.outputImage else {
fatalError("CIConstantColorGenerator outputImage generation failed!")
}
return outputImage.cropped(to: extent)
}
3士飒、圖像覆蓋合成濾鏡(CISourceOverCompositing)
// 3.圖像覆蓋合成濾鏡(CISourceOverCompositing)
// iOS8.0開始 <func composited(over dest: CIImage) -> CIImage> 的實現(xiàn)原理
public func compositeSource(over dest: CIImage) -> CIImage {
let parameters: [String: Any] = [
kCIInputBackgroundImageKey: dest,
kCIInputImageKey: self
]
guard let filter = CIFilter(name: "CISourceOverCompositing", parameters: parameters) else {
fatalError("CISourceOverCompositing filter creation failed!")
}
guard let outputImage = filter.outputImage else {
fatalError("CISourceOverCompositing outputImage generation failed!")
}
return outputImage.cropped(to: extent)
}
4、顏色疊層濾鏡
// 4.顏色疊層濾鏡
public func overlaid(color: UIColor) -> CIImage {
let overlay = generated(color: color)
return overlay.compositeSource(over: self)
}
Contact
QQ: 2256472253
Email: ixialuo@126.com