寫在前面
有了簡(jiǎn)單的圖片濾鏡基礎(chǔ)朴则,接下來(lái)就可以做一些難一點(diǎn)操作,圖片合成老電影的特效
整合成一個(gè)三方庫(kù)钓简,以下只是部分代碼乌妒,詳細(xì)代碼及demo請(qǐng)見(jiàn),github地址https://github.com/dudongge/DDGScreenShot
DDGScreenShot 所有功能演示
image
image
具體代碼
//這個(gè)是高斯模糊的代碼外邓,比較的簡(jiǎn)單
func gaussianBlurFilmEffect() {
filter = CIFilter(name: "CIGaussianBlur")
filter.setValue(10.0, forKey: "inputRadius")
let inputImage = CIImage(image: originalImage)
filter.setValue(inputImage, forKey: kCIInputImageKey)
let outputImage = filter.outputImage!
let cgImage = context.createCGImage(outputImage, from: outputImage.extent)
self.imageView.image = UIImage(cgImage: cgImage!)
}
這個(gè)是合成老電影的過(guò)程)
中間有一些屏蔽的代碼是做輸出校驗(yàn)用的撤蚊,查看當(dāng)前的輸出
func oldFilmEffect(){
let inputImage = CIImage(image: originalImage)!
// 1.創(chuàng)建CISepiaTone濾鏡(棕綠色)
let sepiaToneFilter = CIFilter(name: "CISepiaTone")!
sepiaToneFilter.setValue(inputImage, forKey: kCIInputImageKey)
//參數(shù)是強(qiáng)度
sepiaToneFilter.setValue(1, forKey: kCIInputIntensityKey)
// let outputImage = sepiaToneFilter.outputImage!
// let cgImage = context.createCGImage(outputImage, from: outputImage.extent)
// imageView.image = UIImage(cgImage: cgImage!)
// 2.創(chuàng)建白班圖濾鏡
let whiteSpecksFilter = CIFilter(name: "CIColorMatrix")!
whiteSpecksFilter.setValue(CIFilter(name: "CIRandomGenerator")!.outputImage!.cropped(to: inputImage.extent), forKey: kCIInputImageKey)
whiteSpecksFilter.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputRVector")
whiteSpecksFilter.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputGVector")
whiteSpecksFilter.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputBVector")
whiteSpecksFilter.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputBiasVector")
// let outputImage = whiteSpecksFilter.outputImage!
// let cgImage = context.createCGImage(outputImage, from: outputImage.extent)
// imageView.image = UIImage(cgImage: cgImage!)
// 3.把CISepiaTone濾鏡和白班圖濾鏡以源覆蓋(source over)的方式先組合起來(lái)
let sourceOverCompositingFilter = CIFilter(name: "CISourceOverCompositing")!
sourceOverCompositingFilter.setValue(whiteSpecksFilter.outputImage, forKey: kCIInputBackgroundImageKey)
sourceOverCompositingFilter.setValue(sepiaToneFilter.outputImage, forKey: kCIInputImageKey)
// 4.用CIAffineTransform濾鏡先對(duì)隨機(jī)噪點(diǎn)圖進(jìn)行處理 應(yīng)用坐標(biāo)系
let affineTransformFilter = CIFilter(name: "CIAffineTransform")!
affineTransformFilter.setValue(CIFilter(name: "CIRandomGenerator")!.outputImage!.cropped(to: inputImage.extent), forKey: kCIInputImageKey)
affineTransformFilter.setValue(NSValue(cgAffineTransform: CGAffineTransform(scaleX: 1.5, y: 25)), forKey: kCIInputTransformKey)
// let outputImage = affineTransformFilter.outputImage!
// let cgImage = context.createCGImage(outputImage, from: outputImage.extent)
// imageView.image = UIImage(cgImage: cgImage!)
// 5.創(chuàng)建藍(lán)綠色磨砂圖濾鏡
let darkScratchesFilter = CIFilter(name: "CIColorMatrix")!
darkScratchesFilter.setValue(affineTransformFilter.outputImage, forKey: kCIInputImageKey)
darkScratchesFilter.setValue(CIVector(x: 4, y: 0, z: 0, w: 0), forKey: "inputRVector")
darkScratchesFilter.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputGVector")
darkScratchesFilter.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputBVector")
darkScratchesFilter.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputAVector")
darkScratchesFilter.setValue(CIVector(x: 0, y: 1, z: 1, w: 1), forKey: "inputBiasVector")
// 6.用CIMinimumComponent濾鏡把藍(lán)綠色磨砂圖濾鏡處理成黑色磨砂圖濾鏡
let minimumComponentFilter = CIFilter(name: "CIMinimumComponent")!
minimumComponentFilter.setValue(darkScratchesFilter.outputImage, forKey: kCIInputImageKey)
// 7.最終組合在一起
let multiplyCompositingFilter = CIFilter(name: "CIMultiplyCompositing")!
multiplyCompositingFilter.setValue(minimumComponentFilter.outputImage, forKey: kCIInputBackgroundImageKey)
multiplyCompositingFilter.setValue(sourceOverCompositingFilter.outputImage, forKey: kCIInputImageKey)
// 8.最后輸出
let outputImage = multiplyCompositingFilter.outputImage!
let cgImage = context.createCGImage(outputImage, from: outputImage.extent)
imageView.image = UIImage(cgImage: cgImage!)
}
結(jié)束語(yǔ)
看完這一節(jié),對(duì)高斯模糊损话,老電影高級(jí)用法有了更深的認(rèn)識(shí)侦啸,希望能夠幫助到你。
此代碼已經(jīng)上傳到githup[DDGScreenShot](https://github.com/dudongge/DDGScreenShot)
[link](https://github.com/dudongge/DDGScreenShot)
當(dāng)然這只是這個(gè)庫(kù)的功能的一小部分
想看更多功能席镀,可以去github上下載匹中,如果對(duì)您有幫助,希望您不吝給個(gè)star.
歡迎查看DDGScreenShot