在Core Image中,圖像處理依賴于CIFilter和CIImage這兩個類,一個代表過濾器,一個代表輸入和輸出的圖像。
以下是對圖像應用濾鏡的基本代碼
import?CoreImage
let?context = CIContext()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 1
let?filter = CIFilter(name: "CISepiaTone")!? ? ? ? ? ? ? ? ? ? ? ? // 2
filter.setValue(0.8, forKey: kCIInputIntensityKey)
let?image = CIImage(contentsOfURL: myURL)? ? ? ? ? ? ? ? ? ? ? ? ? // 3
filter.setValue(image, forKey: kCIInputImageKey)
let?result = filter.outputImage!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 4
let?cgImage = context.createCGImage(result, from: result.extent)? ? // 5
1、注意CIContext是一個重量級對象,如果你需要創(chuàng)建應盡早創(chuàng)建,并在每次處理圖像時重用他。
2、CIFilter對象代表要應用的過濾器,可以為其參數提供值
3、通過URL提供的CIImage對象代表要處理的圖像,將它提供給過濾器作為參數
4、filter.outputImage這里的CIImage并不代表圖像添加了濾鏡,而是一個"配方",這個配方指明了如何去創(chuàng)建一個對應添加濾鏡后的圖像。
5、最后我們通過CIImage生成一個Core Graphics Image以便于我們展示及保存該圖像
為視頻添加濾鏡
AVFoundation提供了一個叫AVVideoComposition的類。您可以使用AVVideoComposition對象在回放或導出過程中將CIFilter應用于視頻的每一幀。
let filter = CIFilter(name: ciFilterName)!
let composition =AVVideoComposition(asset: player.currentItem!.asset, applyingCIFiltersWithHandler: {? request in
? ? ? ? ? ? filter.setDefaults()
? ? ? ? ? ? filter.setValue(request.sourceImage, forKey:kCIInputImageKey)
? ? ? ? ? ? let output = filter.outputImage
? ? ? ? ? ? // Provide the filter output to the composition
? ? ? ? ? ? request.finish(with: output!, context:nil)
})
當你通過videoCompositionWithAsset:applyingCIFiltersWithHandler:這個初始化方法創(chuàng)建AVVideoComposition對象時,提供了一個handler來將過濾器加到每一幀畫面上。 在播放或導出期間,AVFoundation會自動調用handler來處理圖像。在handler中,通過AVAsynchronousCIImageFilteringRequest來獲取每一幀圖像來添加濾鏡,然后提供過濾后的圖像以供合成使用。
player.currentItem?.videoComposition = composition?
?/*在播放中,我們將AVVideoComposition對象賦值給player.currentItem.videoComposition便可播放加濾鏡后的視頻。*/
exportSession.videoComposition = player.currentItem?.videoComposition??
/*在導出視頻過程中將AVVideoComposition對象賦值給exportSession.videoComposition便可導出加濾鏡后的視頻。*/
代碼地址:https://github.com/JianBinWu/SWSwiftPractice
GIF圖演示: