티스토리 뷰

728x90
반응형

CIBlendKernel는 CIColorKernel의 서브클래스입니다. 

두개의 이미지를 blending (혼합) 하는데 사용한다고 합니다. 

 

[1] input type

 

두개의 파라미터를 가집니다. (foreground image와 background image)

 

Core Image Kernel Language 라면 인풋 타입이 __sample

Metal Shading Language 라면 인풋 타입이 sample_t 입니다. 

 

 

[2] return type

pixel color for the output image를 리턴합니다.

 

Core Image Kernel Language 라면 리턴 타입이 vec4

Metal Shading Language 라면 리턴 타입이 float4 입니다. 

 

 

[3] 예제

 

Background image하나를 넣어줍니다.

 

 

메탈 파일에 averageBlend라는 함수를 추가해줍니다.

두개 input image의 rgba 값의 평균을 리턴해줍니다. 

foreground와 background를 반반씩 블렌딩하려는 것 같아요

 

https://developer.apple.com/documentation/coreimage/ciblendkernel

 

그리고 CIBlendKernel을 만들고 돌려주세요~

(폭풍 강제 언래핑...실제로 이렇게 따라하면 안됩니다..)

 

import UIKit
class ViewController: UIViewController {
@IBOutlet weak var imgView: UIImageView!
var beginImage: CIImage!
var context: CIContext!
override func viewDidLoad() {
super.viewDidLoad()
self.beginImage = CIImage(image: UIImage(named: "milk")!)
self.context = CIContext(options: nil)
self.applyBlendKernel()
}
func applyBlendKernel() {
let backgroundImage = CIImage(image: UIImage(named: "background")!)!
let url = Bundle.main.url(forResource: "default", withExtension: "metallib")!
let data = try! Data(contentsOf: url)
let kernel = try! CIBlendKernel(functionName: "averageBlend", fromMetalLibraryData: data)
let outputImage = kernel.apply(foreground: beginImage, background: backgroundImage)!
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
let processedImage = UIImage(cgImage: cgimg)
self.imgView.image = processedImage
}
}
}

 

그러면 이렇게 백그라운드 이미지와 블렌딩이 된 결과가 나오네요...! 

 

 

 

[4] Builtin Blend Kernels

 

3번처럼 따로 메탈파일에 blend함수 안만들어줘도 

빌트인 커널들을 사용할 수 있습니다 (꽤 많아요)

 

 

 

 

그 중에서 vividLight라는 것을 써볼게요-! 

 

 

 

 

func applyBlendKernel() {
let backgroundImage = CIImage(image: UIImage(named: "background")!)!
let kernel = CIBlendKernel.vividLight
let outputImage = kernel.apply(foreground: beginImage, background: backgroundImage)!
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
let processedImage = UIImage(cgImage: cgimg)
self.imgView.image = processedImage
}
}

 

반응형
댓글