現在很難找到一個相機應用甚至圖片應用沒有濾鏡功能的,而其實 Core Image 也能玩濾鏡。
Image Filter
- 在 App 的底部放一個可以橫向移動的 UICollectionView
- Cell 內部會顯示一張通過濾鏡處理後的圖片。
- 當我們選擇其中一個 Cell 的時候,將濾鏡的效果套用在上方的大圖上。
處理圖片的過程
- 複製一份 cgImage
- 通過 Filter 名稱建立一個 Filter
- 建立 context
- 在 context 上畫出過濾後的圖片
- 輸出過濾後的圖片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
fileprivate func renderImage(image:UIImage, filterName:String) -> UIImage? { // 1 - copy cgImage from image let sourceImage = CIImage(cgImage: image.cgImage!) // 2 - init filter let filter = CIFilter(name: filterName) filter?.setValue(sourceImage, forKey: kCIInputImageKey) // 3 - init context let context = CIContext(options: nil) // 4 - output filtered image if(filter?.outputImage != nil){ if let outputCGImage = context.createCGImage(filter!.outputImage!, from: filter!.outputImage!.extent) { return UIImage(cgImage: outputCGImage!) } } return nil } |
查看可用的 Filter
還沒有看到文章介紹有什麼濾鏡可以用,不過我們可以把他們的名稱以及對應的參數印出來。
Filter Names
1 |
CIFilter.filterNames(inCategory: kCICategoryBuiltIn) |
相關的參數也能通過 filter 獲得
1 2 3 4 |
let filter = CIFilter(name: filterName) filter.inputKeys filter.outputKeys filter.attributes |
有時候我們也會混合使用濾鏡,比如對一張照片同時用了棕褐色濾鏡 + 加光亮度濾鏡。
參考
- 官方文件 – CIFilter
- 官方文件 – Core Image Filter Reference
- Objc – CoreImage 介紹
- 可以到 Github 上看對應的 Source Code