UIImage VS CGImage VS CIImage



● UIImage 

UIImage라는 이름에 걸맞게, UIImage는 UIKit안에 있는 클래스입니다.

정의도 간단;;;


"An object that manages image data in your app."

"앱의 이미지 데이터를 관리하는 객체입니다."


이미지 객체를 사용하여 모든 종류의 이미지 데이터를 표현 할 수 있으며, UIImage 클래스는 기본 플랫폼에서 지원하는 모든 이미지 형식의 데이터를 관리 할 수 있습니다. 
이미지객체는 변경 불가능(immutable)하므로, 당신은 항상 이미 존재하는 디스크에있는 이미지파일이나 프로그래밍으로 생성된 이미지 데이터에서 새로운 이미지객체를 만들어야 합니다.
이미지 객체가 모든 플랫폼 고유의 이미지 형식을 지원하지만 앱의 대부분의 이미지에 PNG 또는 JPEG 파일을 사용하는 것이 좋습니다. 객체는 두 형식 모두를 읽고 표시 할 수 있도록 최적화되어 있으며 이러한 형식은 다른 대부분의 이미지 형식보다 우수한 성능을 제공합니다. PNG 형식은 무손실이기 때문에 앱 인터페이스에서 사용하는 이미지에 특히 좋습니다.




● CGImage 

<CGColor와 UIColor의 차이>글을 읽고오신분이라면...CG라는 것을 보고......바로 알아챘을 수도 ㅎㅎ..
네, CGImage의 CG는 Core Graphics의 약자입니다!!!
Core Graphics 프레임워크 안에 있는 녀석이죠.
정의는;;UIImage보다 더 간단함 

"A bitmap image or image mask."
"비트맵 이미지 또는 이미지 마스크."

허허..이걸 알려면 Quartz 2D Programming Guide를 읽어야 하네요..
간단하게 말하면, CGImage는 비트맵만 나타낼 수 있다고 합니다. blend modes나 masking과 같은 작업에는 CGImageRefs가 필요해요. 
실제 비트 맵 데이터에 접근하고 변경해야하는 경우 CGImage를 사용할 수 있습니다. 또한 NSBitmapImageReps로 변환 될 수 있습니다. CGImage에서 새로운 UIImage를 생성하려면, 이런식으로 하면 돼요. 

var aNewUIImage = UIImage(CGImage: imageRef)
//where imageRef is a CGImage




CGImage의 프로퍼티들을 보면, 



아주 비트비트스럽죠





 CIImage 

CIImage의 CI는 뭘까...

못들어본 사람도 있을거에요! 바로 "Core Image"라는 프레임워크의 약자이며, CIImage는 바로 이 Core Image프레임워크 안에 있는 클래스에요.

정의는 

"A representation of an image to be processed or produced by Core Image filters."

"코어 이미지 필터(Core Image filters)에 의해 처리되거나 생성 될 이미지의 표현."

그리고 아주아주 흥미로운 정보가 있어요.


"A CIImage is a immutable object that represents an image. It is not an image."

CIImage는 이미지를 나타내는 불변(immutable)객체 입니다. 그것(CIImage)은 이미지가 아닙니다. 


이미지가 아니래요!!! 이미지가 아니면 뭐냐? 

"관련된 이미지 데이터만 있으며, 이미지를 생성하는데 필요한 모든 정보가 있습니다"

오...신기..더 알아봅시다.


일반적으로 CIImage 객체는 CIFilter, CIContext, CIColor 및 CIVector와 같은 다른 Core Image 클래스와 함께 사용됩니다. CIImage 객체에는 연관된 이미지 데이터가 있지만 이미지가 아닙니다. CIImage 객체를 이미지 "레시피(recipe)"로 생각할 수 있습니다.


CIImage 객체는 이미지를 생성하는 데 필요한 모든 정보를 가지고 있지만 Core Image  실제로 그렇게 할 때까지(실제로 이미지를 생성할 때 까지) 이미지를 렌더링하지 않습니다. 

이 "게으른 평가(lazy evaluation)"방법은 Core Image가 가능한 한 효율적으로 작동하도록합니다.


CIContext 및 CIImage 객체는 변경 불가능합니다. 즉, 각 객체를 스레드간에 안전하게 공유 할 수 있습니다. 여러 스레드가 동일한 GPU 또는 CPU CIContext 객체를 사용하여 CIImage 객체를 렌더링 할 수 있습니다. 


하지만 이는 CIFilter객체 경우에는 아닙니다. CIFilter 객체는 스레드간에 안전하게 공유 할 수 없습니다

앱이 다중 스레드 인 경우 각 스레드는 고유 한 CIFilter 객체를 만들어야합니다. 


Core Image는 자동 조정 방법도 제공합니다. 이 메소드는 이미지에 공통적 인 결함이 있는지 분석하고 해당 결함을 수정하기 위해 일련의 필터를 반환합니다. 필터에는 스킨 톤, 채도, 대비 및 그림자의 값을 변경하고 플래시로 인한 적목 현상 또는 기타 아티팩트를 제거하여 이미지 품질을 향상시키는 값이 미리 설정되어 있습니다. 


OverView에 있는 내용을 번역해본건데..막 스레드니.......뭐니...잘 이해가 안가죠? 그래서 CIImage로 뭘 할 수 있는데;;

CIImage를 가지고, CIFilter등 다른 Core Image 클래스를 사용하면,

이런거


또는 이런거





를 할 수 있게됩니다. 그냥 쉽게 생각해서!!!!!이미지에 필터 씌울 수 있다!!!!라고 생각하시면 편합니다. 아니 음..Core Image에서의 기능 중 하나라고 보시면 됩니다. 이런 작업들을 하려면 CIImage로 해야한다는 것이죠.

CIFilter를 보면..정말 엄청나게 많은 효과?필터?들을 이미지에 입힐 수 있다는 것을 보실 수 있습니다...


음...솔직히 말해서 CGImage는 아직 조금 감이 안온달까

비트맵을 다룰 수 있다는건 알겠는데....어떤식으로 뭘 할 수 있는지...잘...ㅎㅎ..

오늘 글을 정리하자면, 앱 내에서 기본 이미지 타입을 다룰거라면 UIImage(png가 제일 좋다), 비트맵을 다룰거라면 CGImage, 이미지에 필터나 다양한 효과를 적용하고 싶다면 CIImage를 사용하면 된다?..이정도가 되겠네요 :)

오늘도 도움이 되었길 바래요 :) 혹시 틀린부분이 있다면 댓글로 말해주세요 XD


참고 : https://medium.com/@ranleung/uiimage-vs-ciimage-vs-cgimage-3db9d8b83d94

https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIBoxBlur

https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html

https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html



출처: https://zeddios.tistory.com/455 [ZeddiOS]

'공부 > iOS' 카테고리의 다른 글

Swift Numbers& Booleans 정수, 실수  (0) 2018.11.08
Swift Naming Convention  (0) 2018.11.08
Swift 변수 Variables / 상수 let 차이  (0) 2018.11.08

+ Recent posts