High Dynamic Range
이미지 내의 밝은 부분과 어두운 부분의 차이를 극대화시킨 영상을 구현하는 포괄적인 기술을 의미한다.
다이내믹 레인지는 특정 이미지에서 표현된 가장 밝은 부분과 가장 어두운 부분의 차이를 의미한다. 아래의 사진과 같은 상황이 바로 다이내믹 레인지가 크다고 표현할 수 있는 상황이다.
왼쪽은 하늘의 노을은 잘 표현하였지만, 하늘에 비해 땅은 너무 어두워 잘 보이지 않는다. 중앙의 사진은 반대로 땅의 모습은 잘 보이지만, 밝은 하늘은 하얗게 날아가 보이지 않는다. 이 때, 이 두 장의 사진을 합성하면 오른쪽 사진과 같이 어두운 부분과 밝은 부분의 모습을 모두 살려낼 수 있다.
위의 사진처럼 정상에서 햇빛을 바라보며 풍경을 본 경험이 있는 사람이라면 왼쪽과 중앙의 사진은 눈으로 보는 것과는 무언가 다르다는 사실을 알 수 있다. 우리 눈으로 봤을 때의 풍경은 오른쪽 사진과 같이 하늘도 땅도 잘 보이는데, 막상 사진을 찍어보면 전혀 그렇게 나오지 않는다.
그 이유는, 어두운 부분일수록 빛에 훨씬 민감해지면서 밝은 부분과의 밝기 차이가 균일하게 표현되는 사람의 눈과 달리 카메라 센서는 어둡건 밝건 밝기를 항상 균일하게 받아들이기에 실제에 비해 밝기 편차가 심하게 표현되며, 그 밝기 편차를 일반적인 8비트 컨테이너에서는 제대로 표현하기 어렵기 때문이다. 그래서 사람의 눈으로 직접 보는 것과는 다른 결과물이 나오게 된다. 때문에 애초에 살리고자 하는 부분을 다르게 해 여러 장을 촬영한 다음 합성하여 사진 속의 내용물 모두를 이미지 내에서 표현할 수 있도록 하는 HDR 촬영 방식이 만들어졌다.
iPhone은 기본적으로 사진 촬영시 자동으로 HDR을 지원한다.
설정 -> 카메라 -> 스마트 HDR On / Off
설정 -> 카메라 -> 비디오 녹화 -> HDR 비디오 On / Off
아이폰은 기본 설정으로 HDR이 ON이다.
이를 코드상에서 제어하려면
var captureDevice: AVCaptureDevice?
override func viewDidLoad() {
super.viewDidLoad()
self.captureDevice?.automaticallyAdjustsVideoHDREnabled = false
self.captureDevice?.isVideoHDREnabled = false
}
위와 같이 HDR관련한 설정 2개를 false로 하면 된다.
각 Property에 대해 알아보자
/**
@property automaticallyAdjustsVideoHDREnabled
@abstract
Indicates whether the receiver is allowed to turn high dynamic range streaming on or off.
@discussion
The value of this property is a BOOL indicating whether the receiver is free to turn high dynamic range streaming on or off. This property defaults to YES. When automaticallyAdjustsVideoHDREnabled, the AVCaptureDevice turns videoHDR on automatically if it's a good fit for the activeFormat. -setAutomaticallyAdjustsVideoHDREnabled: throws an NSGenericException if called without first obtaining exclusive access to the receiver using -lockForConfiguration:. Clients can key-value observe videoHDREnabled to know when the receiver has automatically changed the value.
*/
@available(iOS 8.0, *)
open var automaticallyAdjustsVideoHDREnabled: Bool
/**
@property videoHDREnabled
@abstract
Indicates whether the receiver's streaming high dynamic range feature is enabled. See AVCaptureDeviceFormat.isVideoHDRSupported.
@discussion
The value of this property is a BOOL indicating whether the receiver is currently streaming high dynamic range video buffers, also known as Extended Dynamic Range (EDR). The value of this property is ignored when device.activeColorSpace is HLG BT2020 color space since HDR is effectively always on and can't be disabled. The property may only be set if you first set automaticallyAdjustsVideoHDREnabled to NO, otherwise an NSGenericException is thrown. videoHDREnabled may only be set to YES if the receiver's activeFormat.isVideoHDRSupported property returns YES, otherwise an NSGenericException is thrown. This property may be key-value observed.
Note that setting this property may cause a lengthy reconfiguration of the receiver, similar to setting a new active format or AVCaptureSession sessionPreset. If you are setting either the active format or the AVCaptureSession's sessionPreset AND this property, you should bracket these operations with [session beginConfiguration] and [session commitConfiguration] to minimize reconfiguration time.
*/
@available(iOS 8.0, *)
open var isVideoHDREnabled: Bool
automaticallyAdjustsVideoHDREnabled
는 기본적으로 YES이며, ActiveFormat에 적합한 경우 비디오 HDR을 자동으로 켠다고 한다.
isVideoHDREnabled
는 기본적으로 YES이며, HDR Video Buffer를 Streaming하고 있는지 표시한다.