-
[CameraX] resolution(해상도) 조절 및 fallback 설정Android 2025. 8. 5. 08:31728x90반응형
이미지를 외부 저장소에 저장할 때 너무 큰 사이즈로 저장이 되었다
사이즈와 해상도가 크다보니 파일 크기도 높아졌다
CameraX에서는 이런 해상도를 조절할 수 있는 기능이 있어서 적용해보았다
@Params boundSize
boundSize를 기준으로 최고의 해상도를 선택 -> 없으면 fallbackRule에 정한 해상도 룰을 따름
@Params fallbackRule
boundSize에서 정한 사이즈에 맞는 해상도를 기기에서 지원하지 않을 때 설정해놓은 fallbackRule 적용함
cameraX에서는 최적화된 fallbackRule 옵션을 지원함
나의 경우 boudnSize를 어떻게 할까 하다가 아래와 같은 글을 보게 되었다
https://www.adobe.com/kr/creativecloud/video/discover/video-resolution.html
최적의 해상도를 찾는 방법 | Adobe
디지털 영상 해상도와 종횡비, 프레임 속도, 영상 편집의 상관관계를 살펴보고, 요구 사항을 충족하는 영상 해상도를 찾아보세요.
www.adobe.com
4K같이 너무 높은 해상도거나 HD이 조금 낮은 해상도를 저장하는 건 아니라고 생각이 들었다
그래서 일반 스마트폰에서 많이 쓰인다는 FUll HD(1920 * 1080)를 사용하기로 했다
sealed class ImageResolutions (resolution: String) { data class FullHD(val resolution: String = "1920,1080"): ImageResolutions(resolution) data class HD(val resolution: String = "1280,720"): ImageResolutions(resolution) data class TwoK(val resolution: String = "2048,1080"): ImageResolutions(resolution) data class FourK(val resolution: String = "3840,2160"): ImageResolutions(resolution) } // 중간 생략 when (cameraMode) { CameraMode.PHOTO_CAPTURE -> { // 이미지 해상도 width, height val (w, h) = ImageResolutions.FullHD().resolution.split(",") // 해상도 전략 (기기에서 지원하지 않는 해상도 전략인 경우 실행할 fallback 포함) val resolutionStrategy = ResolutionStrategy(Size(w.toInt(), h.toInt()), ResolutionStrategy.FALL_BACK_CLOSEST_LOWER_THEN_HIGHER) // 해상도 전략 selector val resolutionSelector = ResolutionSelector.Builder() .setResolutionStrategy(resolutionStrategy) .build() // 이미지 캡처 설정 val capture = ImageCapture.Builder() .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) .setResolutionSelector(resolutionSelector) .build() imageCapture = capture // 카메라 바인딩 (사진 촬영) cameraProvider.bindToLifecycle( lifecycleOwner, cameraSelector, preview, capture ) }
이미지 해상도를 미리 정의해놓고 거기서 해상도의 width, height를 뽑아서 사용했다
ResolutionStrategy에 두 번째로 들어가는 파라미터는 다음과 같은 fallbackRule들이 있다
https://developer.android.com/reference/androidx/camera/core/resolutionselector/ResolutionStrategy
ResolutionStrategy | API reference | Android Developers
androidx.appsearch.builtintypes.properties
developer.android.com
- FALL_BACK_CLOSEST_LOWER
지정한 boundSize를 사용할 수 없을 때, 지정한 boundSize와 가장 가까운 고해상도 크기 사용
- FALL_BACK_CLOSEST_HIGHER_THEN_LOWER
지정한 boundSize를 사용할 수 없을 때, 지정한 boundSize와 가장 가까운 고해상도 크기를 사용하지만 그럼에도 사용 가능한 해상도를 찾을 수 없는 경우 저해상도 크기 사용
- FALL_BACK_CLOSEST_LOWER
지정한 boundSize를 사용할 수 없을 때, 지정한 boundSize와 가장 가까운 낮은 해상도 크기 사용
- FALL_BACK_CLOSEST_LOWER_THEN_HIGHER
지정한 boundSize를 사용할 수 없을 때, 지정한 boundSize와 가장 가까운 저해상도 크기를 사용하지만 그럼에도 사용 가능한 해상도를 찾을 수 없는 경우 고해상도 크기 사용
=> 내 경우 FALL_BACK_CLOSEST_LOWER_THEN_HIGHER를 사용했다
HD를 지원하지 않는 경우 더 높은 해상도를 지원하지 않을 거 같았기에 저해상도를 쓰게 하고 만약 찾을 수 없다면 기기에서 지원하는 고해상도의 크기를 쓰는게 나을 거 같았기 때문이다
적용한 결과 같은 것을 찍어도 이미지 파일 크기와 사이즈가 줄어든 것을 볼 수 있다
반응형'Android' 카테고리의 다른 글
[Jetpack Compose] 텍스트의 일부분 스타일 변경하기 (2) 2025.08.06 [Compose] LazyVerticalGrid 버벅거림 현상 해결해보기 (1) 2025.04.25 [Android] Splash Screen 만들기 (with Lottie) (2) 2024.12.26 [Android] Activity, Fragment, FragmentView LifeCycle (1) 2024.12.25