티스토리 뷰

728x90
반응형

CIWarpKernel은 CIKernel 의 서브클래스로 

이미지에서 geometry 관련 정보만 프로세싱 할 때 쓰인다고 합니다.

 

Warp라는 단어는 " (원래의 모습을 잃고)  휘게 만들다" 라는 뜻을 가지고 있습니다.

 

 

[1] input type

 

 Core Image Kernel Language에서는 input 파라미터가 필요없는 것같고 

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

 

 Metal Shading Language에서는 input type이 destination인데,

 destination은 float2를 의미합니다.

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

[2] return type 

이미지 좌표의 포지션을 리턴해줍니다.

 

Core Image Kernel Language에서는 리턴타입이 vec2,

Metal Shading Language에서는 리턴타입이 float2 입니다.

 

 

=> 아래에서 여러 예제를 돌려보니까

center값 (x,y) 을 의미하는 것 같아요..!

 

 

[3] 예제

 

우선 CIWarpKernel은 딱 하나의 인풋 이미지만 사용한다고 합니다--!!

CIWarpKernel 전용 apply함수를 보면 이렇게 image 파라미터가 따로 있습니다. 

 

 

그래서 CIColorKernel 처럼 arguments에 인풋 이미지를 넘겨주는게 아니라

let kernel = try! CIColorKernel(functionName: "myColor3", fromMetalLibraryData: data)
let output = kernel.apply(extent: beginImage.extent, arguments: [beginImage as Any])!

 

image파라미터에 인풋이미지를 넘겨주고 arguments는 비워둡니다.

let kernel = try! CIWarpKernel(functionName: "warp", fromMetalLibraryData: data)

let outputImage = kernel.apply(extent: beginImage.extent, roiCallback: { (index, rect) -> CGRect in
    return rect
}, image: beginImage, arguments: [])!

 

그리고 roiCallBack 은 뭔지 모르겠어서 그냥 rect를 리턴해줬습니다.

문서에는 이렇게 예제가 나와있어요

 

https://developer.apple.com/documentation/coreimage/cikernelroicallback?language=objc

 

 

그럼 테스트해볼 최종 코드는 이렇게 되겠습니다. (강제 언래핑 부분은 절대 따라하지마시오!!!)

 

 

 

메탈 파일을 만들고 그 안에 warp함수를 만들어줍니다

인풋이미지의 포지션을 그대로 리턴해주는 함수로 시작하겠습니다.

 

 

 

 

위의 코드를 돌려보면

원본이미지와 같게 결과가 나옵니다.

 

 

 

x쪽으로 - 200, y쪽으로+ 200 가게 해주면,,?

 

 

 

두배 해주면,,,?

 

 

 

1/2 해주면,,,?

 

 

 

x, y 값을 서로 바꿔주면...?

 

 

반응형
댓글