스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
앱에서 HDR 이미지 지원하기
앱에서 HDR 스틸 이미지를 식별 및 로드, 표시, 생성하는 방법을 알아보세요. HDR의 일반적인 개념과 최신 업데이트 사항인 ISO 사양을 살펴봅니다. SwiftUI와 UIKit에서 HDR 이미지를 식별하고 표시하는 법, ProRAW 및 RAW 캡처에서 HDR 이미지를 생성하는 법, 이를 CALayer에서 표시하는 방법을 알려 드립니다. 또한 CoreGraphics의 ISO HDR 지원을 소개하고, HDR 도입의 모범 사례를 살펴보겠습니다.
리소스
- Edit and play back HDR video with AVFoundation
- Editing and Playing HDR Video
- Export HDR media in your app using AVFoundation
- Processing HDR Images with Metal
- Supporting HDR images in your app
관련 비디오
WWDC23
WWDC22
-
다운로드
안녕하세요, 저는 잭슨입니다 전 데이비드죠 이번 세션에서는 HDR 이미지와 이 분야에서 최근 발표된 표준에 관해 알아봅니다
또한 기존 및 신규 API를 사용해 앱에서 HDR 이미지를 지원하는 법을 알려 드리죠
데이비드가 HDR 이미지 파이프라인 사용법을 설명하고 제가 HDR 콘텐츠 디스플레이에 관한 심화 내용으로 마무리하겠습니다
HDR의 원리부터 알아봅시다
현실 세계에서 인간은 광범위한 조도를 인식할 수 있어요 눈의 적응 능력 덕분이죠
반대로 일반적인 SDR 디스플레이는 한정된 범위의 빛만 생성합니다 그래서 이미지를 촬영할 때 넓은 범위의 조도를 어떻게든 SDR 범위로 압축해야 하죠
한편 HDR 디스플레이를 사용하면 압축하지 않고도 훨씬 더 넓은 범위의 빛을 나타낼 수 있습니다 그래서 실제와 더 비슷하면서도 밝고 생생한 이미지를 보여 줄 수 있죠
HDR로 촬영하는 기술은 수년 전부터 있었지만 지금까지는 촬영된 범위를 SDR 디스플레이 범위로 압축해야 했습니다 이제는 HDR 디스플레이에 표시할 때 실제 장면과 더 비슷하게 렌더링할 수 있습니다
예를 들어 설경과 일출을 담은 이 이미지에는 현실 세계의 다양한 조도에 해당하는 영역이 있습니다 SDR 디스플레이에서는 장면의 일부만 정확하게 표현할 수 있죠 HDR 디스플레이에서는 대비를 손상하지 않고 장면을 더 잘 표현할 수 있습니다
HDR 범위의 디스플레이를 쓰면 SDR의 가장 밝은 백색보다 더 밝은 영역도 렌더링할 수 있죠 이것을 헤드룸이라고 합니다
이 패러다임의 기준 백색은 SDR 디스플레이에서 생성할 수 있는 가장 밝은 백색입니다 그 범위를 넘어서면 헤드룸이죠
지난 영상에서 소개한 EDR은 HDR 지원 디스플레이의 헤드룸에서 렌더링할 수 있는 콘텐츠와 상호 작용합니다
이 EDR 패러다임에서 기준 백색은 1.0이고 피크는 디스플레이가 나타낼 수 있는 최댓값입니다 오늘 소개하는 HDR API는 EDR을 사용해 HDR 콘텐츠를 위한 온전한 파이프라인을 구현하죠
EDR에 대해 더 알아보려면 'EDR로 하는 HDR 렌더링 살펴보기' 영상을 확인하세요
HDR 활용의 예를 보여 드리죠 이 SDR 이미지를 보면 기준 백색보다 어두운 영역인 종이의 백색은 괜찮아 보입니다 창문처럼 더 밝은 영역은 조정되어서 표현되죠
하지만 이미지를 HDR로 나타낼 수 있으면 밝은 영역을 훨씬 더 자세히 표시하고 더욱 안정적으로 장면 전체의 대비를 유지할 수 있습니다 이것이 HDR 지원의 이점이죠
왜 HDR을 지원해야 할까요? 여러분이 만드는 앱에서 사용자 제작 콘텐츠가 중요한 경우 HDR을 지원하면 보다 나은 경험을 제공할 수 있습니다
HDR 지원은 거의 모든 Apple 플랫폼에서 가능합니다 Apple의 훌륭한 디스플레이 하드웨어를 십분 활용할 수 있도록 이러한 API를 도입했죠
HDR 지원이 중요한 또 다른 이유는 Apple이 사진 기술 위원회를 통해 국제 표준화 기구와 협력하며 HDR 이미지의 새 기술 사양을 올해 발표할 예정이기 때문입니다 이 TS22028-5 사양은 HDR 콘텐츠의 품질을 저하하지 않고 기존의 스틸 이미지 포맷으로 인코딩하는 구조를 제공합니다
이 사양을 따르는 HDR 이미지를 'ISO HDR'이라고 하겠습니다 HDR 비디오나 캡처, 디스플레이 등 다른 HDR과 헷갈리지 않게요
척도를 다시 보면 sRGB와 Display P3 등 일반적인 SDR 이미지는 검정을 제곱미터당 0.2칸델라 백색을 80칸델라로 정의합니다 한편 ISO HDR은 검정과 기본 기준 백색을 각각 0.0005와 203칸델라로 정의하죠 203 이상은 헤드룸입니다
새 HDR 이미지의 특징은 뭘까요?
이 사양은 Hybrid Log-Gamma(HLG)나 Perceptual Quantizer(PQ)가 인코딩 전달 함수로 필요합니다 이 둘은 SDR 이미지에 쓰이는 감마 곡선과 기능이 유사하죠
ISO HDR 파일의 원색은 BT.2020 원색입니다 지금까지는 비디오에서 주로 쓰던 넓은 색 공간이죠 밴딩 현상을 방지하려면 HDR 이미지는 컴포넌트당 10비트 이상이어야 합니다 그래서 HEIF 같은 일부 포맷은 HDR을 인코딩할 수 있지만 오래된 JPEG와 같은 다른 포맷은 컴포넌트당 8비트만 지원하기 때문에 22028-5와 호환될 수 없습니다 필수 메타데이터로는 기존 ICC 프로파일과 CICP 태그 모두 유효합니다 이러한 요구 사항이 모여 새 ISO HDR 파일을 정의하죠 ISO HDR 파일 관련 추가 선택적 메타데이터 필드 중 몇 가지는 여러분과 관련이 있을 수도 있습니다 Reference environment 태그는 콘텐츠 참조 조건에 대한 주변 조건을 정의합니다
Diffuse white luminance는 해당 콘텐츠의 기준 백색을 정하죠 기본값은 앞에서 말씀드린 203입니다
Scene referred 태그는 HLG가 전달 곡선일 때 사용됩니다 이미지 콘텐츠가 장면과 디스플레이 중 뭘 참조하는지 정의하죠 디스플레이 참조가 기본값입니다
Mastering and content color volume 태그는 기존 HDR 비디오에서 흔히 쓰이며 이미지에 나타난 색상 범위 정보를 정의합니다
마지막으로 Content light level 태그는 이미지 내 장면의 조도에 대한 정보를 제공하죠
ISO HDR에 대한 자세한 내용은 ISO 웹 사이트에 공개된 사양을 참고하세요
ISO HDR 외에도 처음으로 알려 드릴 놀라운 소식이 있는데요 iPhone으로 촬영한 이미지를 최상의 품질로 불러오는 법입니다 2020년부터 iPhone으로 촬영된 사진 수조 장엔 추가 데이터가 담겨 있어 SDR 이미지에서 HDR 표현을 재구성할 수 있습니다 이런 HDR을 Gain Map HDR이라고 합니다
오늘 데이비드와 함께 보여 드릴 새 API를 통해 앱에서 이 HDR 표현에 액세스할 수 있습니다 이미 사진 보관함에 있는 어떤 세대의 Gain Map HDR에서도 훌륭한 HDR 이미지를 보여 줄 수 있게 되죠 이제 새 API로 HDR 이미지를 앱에 결합하는 법을 알아보겠습니다
제가 소개할 API는 SwiftUI, UIKit AppKit에서 사용 가능합니다 SwiftUI와 UIKit API부터 살펴봅시다 지금부터 URL로 액세스할 수 있는 ISO HDR 이미지 파일을 표시해 보겠습니다 그러려면 UIImage를 생성해서 Image View에 제공하면 되죠 새로운 allowedDynamicRange 수정자로 HDR을 활성화하고요 간단하죠?
마찬가지로 UIKit 앱에서도 새로운 UIImageView 프로퍼티를 preferredImageDynamicRange로 설정하면 HDR 결과물이 나타나죠
다이내믹 레인지 프로퍼티에는 HDR 콘텐츠를 처리하는 옵션이 세 가지 있습니다 이러한 프로퍼티는 SwiftUI Image UIImage, NSImage 뷰에서 작동하죠
high 옵션을 사용하면 HDR 콘텐츠를 표시하려는 걸 시스템에 알리고 현재 디스플레이에 콘텐츠를 매핑하는 무거운 작업을 수행할 수 있습니다 디스플레이 상태 변경 시 업데이트도 포함해서요 참고로 이미지가 HDR이 아닌 경우 dynamicRange 플래그가 없을 때와 완전히 동일한 결과가 나타납니다 HDR이 아닌 콘텐츠에 이러한 옵션을 사용해도 안전하죠
standard 옵션은 HDR 렌더링을 비활성화하고 모든 콘텐츠를 SDR로 표시합니다 즉 SDR 범위 밖의 콘텐츠를 맵핑하는 건데요 HDR 기능이 없는 디스플레이에 이미지를 표시하는 방식이죠
마지막으로 constrainedHigh 옵션은 전체가 아닌 일부 HDR만 표시할 때 사용됩니다 HDR 전체가 아닌 일부만 표시하는 이유가 뭘까요? 몇 가지 경우가 있습니다
여러 이미지의 섬네일이 포함된 스택 뷰입니다 HDR인 이미지도 있고 아닌 이미지도 있죠 high DynamicRange 옵션을 쓰면 이런 결과가 나옵니다 몇몇 이미지는 매우 밝은 HDR가 되고 SDR 이미지는 흐릿해지고 심지어 비활성화될 수도 있죠
이번에는 constrainedHigh 옵션을 써 보죠 HDR 콘텐츠가 사용하는 헤드룸을 제한하여 슬라이드가 훨씬 일관되게 보입니다 HDR 이미지와 SDR 이미지를 구분할 수 있으면서도 SDR 이미지가 칙칙하거나 비활성화되는 문제는 없죠 특정 이미지 뷰에 constrainedHigh나 standard를 써야 하는 경우가 또 있습니다 간혹 HDR 콘텐츠가 너무 밝아서 사용자가 앱의 다른 요소에서 시선을 빼앗길 때입니다 이 예시의 작은 이미지는 전체 HDR로 표시되면 앱에서 가장 중요한 부분처럼 보이면서 다른 중요한 제어 기능과 정보에서 주의를 빼앗습니다
알아채셨을 수도 있지만 여기엔 이미지 톤 매핑을 포함하지 않는 옵션이 없습니다 OS가 톤 매핑을 수행하길 원하지 않는다면 저수준 API를 사용해야 합니다 잠시 후에 설명해 드리죠
HDR의 중요한 점은 HDR 데이터를 제한하거나 손상하지 않는 파이프라인이 필요하다는 겁니다 오늘 소개한 API는 전부 완벽히 지원되지만 사용 중단 된 API는 HDR에 안전한 파이프라인이 없을 수도 있죠 예를 들어 이미지 크기를 조정할 때 사용 중단 된 UIGraphicsBeginImage ContextWithOptions를 쓰면 HDR과 넓은 색 공간이 손실될 수 있습니다 HDR을 지원하는 앱을 만들 때 이런 일은 피해야겠죠
섬네일을 생성하는 경우 UIKit가 iOS 15에서 UIImage에 섬네일 API를 도입했습니다 정밀한 크기 조정이 필요한 게 아니라면 이 방법으로 HDR 섬네일을 만드는 걸 추천합니다 제어가 더 필요하거나 iOS 15 이전 버전을 지원해야 하면 UIKit의 UIGraphicsImage Renderer를 써 보세요 imageRendererFormat을 사용하면 UIKit가 이미지를 다시 그릴 때 HDR 정보가 손실되지 않는 렌더러를 구성할 수 있습니다
이미지 데이터를 앱에 불러오는 일반적인 방식을 살펴보죠
PhotoKit의 인터페이스는 앱이 사진 보관함에 접근하게 해 줍니다 저는 제 앱의 메인 뷰에 포토 피커를 추가하여 사용자가 선택한 이미지에 쉽게 액세스하게 했습니다 포토 피커가 HDR 데이터를 보존하지 않는 형식으로 이미지를 트랜스코딩할 수 있으므로 current 인코딩 정책과 일반적인 images 일치 유형을 쓰겠습니다
포토 피커에 대한 자세한 정보는 '앱에 포토 피커 임베딩하기' 세션을 확인하세요 ISO HDR 이미지를 쓰면 DataRepresentation에서 UIImage를 만들고 추가 코드 없이 바로 이미지 뷰에 사용할 수 있습니다
Gain Map HDR도 지원하려는 경우 새로운 UIImageReader를 통해 사용 가능한 HDR 표현을 가져올 수 있습니다 이 API는 기본적으로 HDR 디스플레이에서 HDR 표현을 반환하고 그 외에는 SDR 버전을 반환하죠
지금까지 살펴본 API는 이미지가 HDR인지의 여부에 종속되지 않습니다 HDR인지 알 필요도 없죠 HDR을 표시하도록 이미지 뷰를 설정하면 이미지가 HDR인지는 중요하지 않습니다 하지만 이미지가 HDR인지 식별하려는 파이프라인이나 앱이 있을 수 있죠
UIkit로 isHighDynamicRange 프로퍼티를 확인하면 콘텐츠의 ISO HDR 호환 여부를 알 수 있습니다
AppKit, CoreGraphics CoreImage의 경우 이미지의 CGColorSpace를 확인해야 하죠 CGColorSpaceUsesITUR_2100TF 함수는 ISO HDR 이미지에 true를 반환합니다
HDR 이미지는 폭넓은 헤드룸을 사용할 수 있습니다 예를 들어 현재 iPhone이 생성하는 이미지는 최대 여덟 배의 헤드룸을 사용합니다 하지만 HDR을 표시하는 디스플레이는 일부이며 HDR 디스플레이도 각기 다르죠
iPhone 14은 기준 백색 대비 최대 여덟 배 밝은 HDR 하이라이트를 표시할 수 있으며 iPad Pro 12.9과 MacBook Pro는 최대 16배 Pro XDR Display는 최대 400배 밝은 하이라이트를 표시합니다
나머지 Apple 디스플레이는 헤드룸의 두 배까지 표시하죠 하지만 대부분의 HDR 콘텐츠는 이 정도로 충분하지 않습니다 또한 HDR 기능을 갖춘 외부 디스플레이도 지원되는데요 지원되는 디스플레이가 많은 건 아니지만 앱이 표시되고 있는 디스플레이의 기능을 확인할 수 있는 API가 있습니다
iOS와 iPad OS에서는 potentialEDRHeadroom을 macOS에서는 maximumPotential ExtendedDynamicRange ComponentValue를 쿼리하여 앱을 표시하는 디스플레이의 기능을 확인하세요
심화 내용으로 넘어가기 전에 언제 HDR를 표시하는 게 적절한지 알아봅시다 말씀드렸듯 HDR은 눈에 띕니다 이미지 표시가 앱의 주요 부분이라면 HDR 지원을 고려해야 하죠 하지만 HDR이 주의를 분산시킬 수도 있습니다 따라서 HDR의 화려함이 필요하지 않다면 constrainedHigh이나 standard 옵션을 쓰는 게 낫죠
요약해 봅시다 ISO HDR 이미지를 식별하는 법과 HDR 이미지를 표시하는 법 사진 보관함에서 ISO HDR과 Gain Map HDR에 액세스하는 법 디스플레이의 HDR인지 확인하는 법을 알아봤습니다 이제 HDR 이미지를 읽고 작성하고 조작하는 법을 데이비드가 설명하겠습니다 고마워요, 잭슨 HDR 이미지를 다룰 때 앱이 지원해야 하는 일반적인 작업이 있습니다
ISO HDR이나 Gain Map HDR 이미지를 파일과 데이터에서 메모리로 읽어 들이기 HDR 콘텐츠를 유지하면서 메모리에서 이미지 수정하기 HDR 손실 없이 이미지 클래스 변환하기 마지막으로 ISO HDR 파일에 HDR 이미지 작성하기입니다 기능적 HDR 이미지 파이프라인의 중요한 프로퍼티는 이미지 객체에 연관된 색 공간이 있다는 겁니다 예를 들어 CGImage와 CIImage 객체는 모두 이를 위해 CGColorSpace API를 쓰죠 이미지에 지원되는 색 공간은 다양할 수 있지만 ISO HDR 이미지는 CGColorSpace를 갖습니다 ITUR 2100 HLG 또는 PQ 중 하나죠 이를 숙지하고, ISO HDR 이미지 읽는 법을 알아봅시다 UIImage와 NSImage는 이제 ISO HDR 이미지를 자동으로 읽을 수 있습니다 Apple의 색상 관리 인프라 ColorSync가 HDR ICC 프로파일을 처리하고 디스플레이에 적합한 이미지 객체를 제공하죠
Gain Map HDR 이미지를 읽을 때는 HDR을 선호하는 UIImageReader 구성을 생성해 HDR 표현을 요청할 수 있습니다 이 새로운 동작은 Gain Map HDR 이미지에만 영향을 줍니다 NSImage, UIImage와 마찬가지로 Core Image도 ISO HDR 파일을 자동으로 읽을 수 있습니다 CIImage contentsOfURL API를 사용하기만 하면 되죠 결과로 얻은 CIImage 객체에는 파일의 색 공간을 Core Image 확장 범위 워크스페이스로 올바르게 변환하는 레시피가 자동으로 포함됩니다 코드 디버깅 시 Xcode의 QuickLook 기능으로 이미지 객체 레시피를 검사할 수 있습니다 예시의 QuickLook 팝오버는 이 이미지가 PQ ISO HDR 색 공간에서 변환되었음을 보여 줍니다
코드로 .colorspace 프로퍼티를 가져와서 파일의 색 공간을 검사할 수 있습니다
sRGB, Display P3 등의 SDR 색 공간이거나 HDR 색 공간일 수 있죠
CoreGraphics API를 사용하는 경우 CGImageSourceCreateImage AtIndex를 사용하여 동일한 동작을 수행할 수 있습니다 새 decodeRequest 키를 decodeToHDR로 설정하면 되죠
잭슨이 HDR 이미지를 SDR로 제한하는 경우를 설명했는데요
비슷하게 Core Image를 쓰는 앱은 자동 HDR 지원을 재정의하여 이미지를 SDR로 톤 매핑할 수 있습니다 기능 감지 등의 특정 상황에서 HDR 사용을 지양할 때 유용하죠 CIImage 생성 시 toneMapHDRtoSDR 옵션을 제공하면 이를 활성화할 수 있습니다 이 경우 반환된 CIImage 객체에 레시피 단계가 포함되어 다른 작업이 적용되기 전에 HDR 소스를 SDR 범위로 톤 매핑합니다
이 옵션은 이미지에 HDR 색 공간이 있어야만 유효합니다
결과로 얻은 CIImage는 이미지 뷰가 dynamicRange.standard 옵션을 사용할 때와 동일하게 보이죠 또한 이는 decodeRequest를 decodeToSDR로 설정해 CGImageSourceCreateImageAtIndex를 사용하는 것과 동일한 동작을 수행합니다
기존에는 Gain Map HDR 이미지가 사진 앱에서 풀 다이내믹 레인지를 표시했지만 Core Image나 ImageIO 등의 API에서는 SDR 표현만 가능했습니다 새 API를 사용하면 앱이 Gain Map HDR 이미지의 전체 범위에 액세스할 수 있습니다
이 API는 사용이 매우 간단합니다 CIImage를 초기화할 때 expandToHDR 옵션을 제공하기만 하면 되거든요
이 경우 반환된 CIImage 객체에 기본 이미지와 Gain Map을 결합해 HDR 이미지를 생성하는 레시피가 포함됩니다
이를 지원하는 추가 Gain Map 데이터가 사진 보관함에 있는 경우 이미지의 .colorspace 프로퍼티가 HDR 색 공간이 됩니다
이 동작은 decodeRequest 키를 decodeToHDR로 설정하여 CGImageSourceCreateImage AtIndex를 쓰는 것과 같습니다
이러한 옵션은 RAW 파일에서도 유효한데요 지금부터 자세히 설명하겠습니다
아이폰의 ProRAW 이미지와 카메라의 RAW 이미지는 유연한 이미지 포맷으로 사용자가 매우 창의적으로 제어할 수 있습니다 장면 일부를 HDR 헤드룸으로 렌더링하는 기능도 있죠 많은 RAW 포맷은 다이내믹 레인지가 커서 제한 없는 형식으로 처리되어야 합니다 과정을 설명해 드리죠 먼저 앱에서 표시하려는 게 RAW 파일의 기본 SDR 형태인 경우 평소처럼 URL에서 이미지를 생성하세요 하지만 앱에서 기본 HDR 렌더링 형태를 표시할 때는 새로운 expandToHDR 옵션을 추가하기만 하면 됩니다
반면 앱이 RAW의 모든 기능을 활용하려는 경우 코드가 URL에서 CIRAWFilter를 생성해야 합니다
해당 필터에 출력 이미지를 요청하면 기본 형태의 CIImage가 나타나죠 하지만 이 API의 핵심 장점은 필터 수정이 쉽다는 겁니다
CIRAWFilter 인스턴스에는 출력 이미지를 바꿀 때 앱에서 변경할 수 있는 프로퍼티가 여럿 있습니다 이 프로퍼티에 대해서는 'ProRAW 이미지 캡처하고 처리하기' 세션에서 다뤘지만 그중 HDR과 관련한 프로퍼티 한 가지를 다시 살펴보겠습니다
RAW 이미지의 다이내믹 레인지는 0과 1 사이 임의의 값으로 조정할 수 있습니다 extendedDynamicRangeAmount 프로퍼티는 잭슨이 설명한 viewDynamicRange 제어와 비슷합니다
이 프로퍼티의 기본값은 0이며 이는 출력 이미지가 SDR이라는 뜻입니다 이 프로퍼티의 최댓값은 1이며 이는 출력 이미지가 파일 내 헤드룸을 최대한 사용해야 한다는 뜻이죠 ISO HDR 이미지를 읽는 다양한 방법을 알아봤습니다 이제 HDR 이미지 수정 시 권장 사항을 알려 드리죠
Core Image는 HDR 이미지 작업에 적합한 강력하고 유연한 API를 제공합니다 HDR을 지원하는 내장 필터가 150개 이상 들어 있죠
이 모든 필터가 HDR 콘텐츠가 담긴 이미지를 생성 및 처리할 수 있습니다
이 필터들이 작동하는 이유는 Core Image 작업 색 공간이 고정되지 않고 선형이라서 0에서 1 범위를 벗어난 RGB 값도 허용하기 때문이죠
앱 개발 과정에서 특정 필터의 HDR 지원 여부를 확인할 수 있는데요 필터의 인스턴스를 생성한 뒤 필터 속성에 카테고리를 요청합니다 그러고는 배열에 카테고리 HDR이 포함되었는지 확인하면 되죠 'Core Image, Metal' 'SwiftUI로 EDR 콘텐츠 표시하기' 세션에서 내장 CI 필터 및 커스텀 CI 커널에 관해 더 알아보세요 HDR 이미지를 ISO HDR 파일로 작성하는 방법도 살펴보죠 앱이 메모리 내 이미지 객체를 새로운 파일로 구현하는 경우가 종종 있습니다 원래는 UIImage, jpegData pngData API를 사용해서 8비트 정밀도의 SDR 이미지를 저장했죠
올해부터는 UIImage가 자동으로 ISO HDR 이미지를 작성합니다 객체가 HDR 콘텐츠를 포함할 경우 16비트 PNG나 10비트 HEIF 포맷을 사용해서요 또한 원본 이미지가 Gain Map HDR이라면 ISO HDR로 변환하죠
마찬가지로 Core Image는 HDR PNG 파일을 작성합니다 HDR 색 공간을 지정하고 writePNGRepresentationOfImage를 호출해 RGBA16 포맷을 요청하는 경우에요
또는 HDR 색 공간을 지정하고 writeTIFFRepresentationOfImage를 호출해 RGBA16 포맷을 요청할 경우 HDR TIFF 파일을 작성할 수도 있죠 PNG와 TIFF로는 무손실로 압축되기 때문에 파일 크기가 훨씬 커지는 점을 유의하세요
따라서 가장 좋은 방법은 HEIF 파일을 작성할 때 writeHEIF10Representation OfImage를 사용하고 HDR 색 공간을 지정하는 것입니다
프레임워크 클래스 간이나 색 공간 간에 변환이 필요한 경우도 있습니다
UIImage, CIImage, CGImage IOSurface, CVPixelBuffer 이미지 클래스 간의 변환 처리는 대체로 동일합니다 하지만 HDR 파이프라인 작업 시에는 주의할 사항이 몇 가지 있습니다
먼저 IOSurface나 CVPixelBuffer 객체로의 변환을 알아보죠 이 이미지 유형이 유용한 이유 중 하나는 CALayer의 콘텐츠로 쓰일 수 있기 때문입니다 또한 메모리 효율성이 뛰어난 이중 평면 크로마 서브샘플 이미지를 보유할 수도 있죠 CVPixelBuffer를 사용하기 전에 ISO HDR 호환 콘텐츠가 있는지 확인해야 합니다 가장 먼저 10비트 BiPlanarFullRange와 같은 적절한 형식으로 픽셀 버퍼를 생성합니다
최상의 성능을 위해 버퍼가 표면에 연결되어야 함을 IOSurfacePropertiesKey로 명시해야 합니다
다음으로 CVPixelBuffer에 attachments를 추가해 버퍼에 ISO HDR 호환 색 공간 프로퍼티가 있음을 시스템에 알리죠 CVPixelBuffer가 있는 경우 CIImage 변환이 간단합니다 withCVPixelBuffer API로 CIImage를 호출하면 되죠 CIImage를 CVPixelBuffer로 변환할 땐 CIContext를 사용해 버퍼로 렌더링하면 됩니다
몇몇 상황에서는 앱에 Core Image와 CGImanageRef API 간의 변환이 필요할 수 있습니다
그렇게 변환해서도 HDR 콘텐츠를 보존하려면 HDR 색 공간을 선택하고 RGBA16, RGBAh 포맷 등 높은 픽셀 형식을 요청해야 합니다
올해부터 CoreImage에 추가된 RGB10 포맷은 높은 픽셀 형식이지만 메모리는 절반만 사용합니다
CIImage를 CGImage로 변환하는 것도 매우 편리합니다 CGImages가 다양한 API에서 지원되기 때문이죠 하지만 사용자 대화형 렌더링의 성능 최적화에는 이런 변환이 권장되지 않습니다 빠른 성능을 위해서는 CoreImage가 직접 MTKView로 렌더링하거나 PixelBuffer를 통해 CALayer로 렌더링하는 것이 좋습니다
CALayer 얘기가 나온 김에 더 복잡한 워크플로에 필요한 저수준 API에 관해 잭슨이 더 알려 드리겠습니다 고마워요, 데이비드 CALayer는 최상의 렌더링 성능이 필요하거나 콘텐츠가 앱에 합성되는 방식을 제어할 때 유용한 도구입니다 CALayer에서 HDR 렌더링을 활성화하려면 wantsExtendedDynamicRangeContent 프로퍼티를 설정하면 되죠 CAMetalLayer에서 디스플레이의 헤드룸에 콘텐츠를 표시할 때 쓰는 프로퍼티와 유사합니다
두 메서드의 주요 차이점은 CALayer 프로퍼티가 레이어 콘텐츠의 톤 매핑을 활성화하는 반면 CAMetalLayer는 아니라는 거죠 이게 어떤 의미일까요?
이 이미지와 플롯은 헤드룸이 10배인 콘텐츠를 보여 줍니다 헤드룸이 최소 10배 이상인 디스플레이에서 렌더링하면 두 레이어 모두 동일하게 작동하죠 다섯 배의 헤드룸만 사용 가능한 디스플레이라면 어떨까요?
CAMetalLayer의 경우 다섯 배를 넘는 이미지 데이터가 디스플레이에서 표시할 수 있는 값으로 제한되어 이미지에 급격한 불연속성이 발생합니다
CALayer는 톤 매핑으로 이런 불연속성을 방지하죠 이때 사용되는 톤 매핑 알고리즘은 이미지에 쓰인 전달 곡선에 따라 달라집니다 알고리즘에 대한 자세한 정보는 HLG와 PQ의 ITU 표준을 참조하세요
CALayer는 빠르고 간단하게 HDR 콘텐츠를 화면에 표시하며 CAMetalLayer는 자체적인 톤 매핑 파이프라인을 만듭니다 CALayer로 직접 HDR을 렌더링하려면 이 클래스 중 하나를 사용해야 합니다 CGImage, CVPixelBuffer IOSurface 유형의 객체가 ISO HDR로 적절히 태그된 경우 CALayer에서 렌더링 및 톤 매핑할 수 있습니다 이러한 클래스를 쓰지 않고 CALayer를 직접 사용하려면 데이비드가 설명한 방법으로 변환하면 되죠
HDR 워크플로로 작업할 때는 올바른 픽셀 형식을 쓰는 게 중요합니다 위의 픽셀 형식은 HDR 데이터를 처리할 때 써도 안전합니다 16 및 32비트 플로트 형식은 항상 HDR을 지원합니다 16비트 정수 형식도 올바른 파일 형식과 컨텍스트에서 HDR 콘텐츠를 지원하죠 마지막으로 메모리와 파일 크기가 중요한 경우 10비트 픽셀 형식을 쓰면 됩니다 압축된 ISO HDR 이미지 대부분의 기본 비트 수준이죠 HDR 콘텐츠를 위해 CGImage를 만들 때 쓸 수 있는 CoreGraphics 플래그도 있습니다 방금 목록에서 봤듯 플로트, 하프 플로트 16비트 정수, 10비트 RGB가 사용 가능하죠
이러한 새 기능을 도입할 때 중요한 건 하위 호환성인데요 이전 iOS 및 macOS에서도 HDR 이미지를 처리할 수 있게 지원하는 방법은 뭘까요? ISO HDR 이미지의 경우 CoreImage의 toneMapHDRtoSDR 옵션을 통해 HDR을 SDR로 변환할 수 있습니다 마찬가지로 CoreGraphics CGContex로 렌더링할 때는 SDR CGColorspace를 대상으로 지정하면 이미지가 해당 공간에 톤 매핑됩니다 Gain Map HDR의 경우 버전 확인을 통해 새 expandToHDR 옵션을 사용하세요 이러한 옵션을 생략하면 파일의 HDR 버전 대신 SDR 버전이 로드됩니다 지금까지 새 API를 통해 HDR 이미지를 읽고 작성하고 표시하는 법을 알아봤습니다 Gain Map HDR 표현에 액세스하는 방법과 HDR 기능을 전부 갖춘 파이프라인에 필요한 API도 살펴봤죠
여러분이 HDR로 만들어 낼 작품들이 기대됩니다 시청해 주셔서 감사합니다
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.