티스토리 뷰
CIWarpKernel은 CIKernel 의 서브클래스로
이미지에서 geometry 관련 정보만 프로세싱 할 때 쓰인다고 합니다.
Warp라는 단어는 " (원래의 모습을 잃고) 휘게 만들다" 라는 뜻을 가지고 있습니다.
[1] input type
Core Image Kernel Language에서는 input 파라미터가 필요없는 것같고

Metal Shading Language에서는 input type이 destination인데,
destination은 float2를 의미합니다.

[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를 리턴해줬습니다.
문서에는 이렇게 예제가 나와있어요

그럼 테스트해볼 최종 코드는 이렇게 되겠습니다. (강제 언래핑 부분은 절대 따라하지마시오!!!)
func applyWarpKernel() { | |
let url = Bundle.main.url(forResource: "default", withExtension: "metallib")! | |
let data = try! Data(contentsOf: url) | |
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: [])! | |
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) { | |
let processedImage = UIImage(cgImage: cgimg) | |
self.imgView.image = processedImage | |
} | |
} |
메탈 파일을 만들고 그 안에 warp함수를 만들어줍니다
인풋이미지의 포지션을 그대로 리턴해주는 함수로 시작하겠습니다.

위의 코드를 돌려보면
원본이미지와 같게 결과가 나옵니다.

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


두배 해주면,,,?


1/2 해주면,,,?


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


'🍏 > iOS' 카테고리의 다른 글
[iOS] Lookup Table Image (LUT Image)로 필터 적용하기 with CIColorCube, Metal (2) | 2020.06.23 |
---|---|
[iOS] Steps to create image filters with designers (디자이너와 이미지 필터 만드는 법) (0) | 2020.06.16 |
[CIKernel] CIBlendKernel에 대해 알아보자 (0) | 2020.06.12 |
[CIKernel] CIColorKernel 에 대하여 알아보자 (0) | 2020.06.12 |
[CoreImage] 기본 필터 & 커스텀 필터 (OpenGL, Metal) 적용하기 (0) | 2020.06.12 |
eungding님의
글이 좋았다면 응원을 보내주세요!
- Total
- Today
- Yesterday
- PencilKit
- Python Type Hint
- ipad multitasking
- 플러터 얼럿
- Sketch 누끼
- Dart Factory
- 장고 URL querystring
- Flutter getter setter
- Django Heroku Scheduler
- github actions
- Django Firebase Cloud Messaging
- flutter dynamic link
- Watch App for iOS App vs Watch App
- flutter deep link
- flutter build mode
- 구글 Geocoding API
- METAL
- Flutter 로딩
- Flutter Spacer
- flutter 앱 출시
- DRF APIException
- Django FCM
- cocoapod
- 장고 Custom Management Command
- ribs
- 플러터 싱글톤
- Flutter Text Gradient
- SerializerMethodField
- drf custom error
- Flutter Clipboard
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |