디지털 이미지를 저장하는 데 쓰이는 이미지 파일 포맷 또는 메모리 저장방식의 한 형태이다.

안드로이드에서 시스템 갤러리 어플리케이션의 사진은 기기의 화면밀도보다 해상도가 훨씬 높다.

메모리가 크지않은 환경에서 해당 이미지로 작업을 하게 되면 상당히 큰 메모리를 사용하기 때문에 효율적이지 않다. 이런 경우에는 해상도를 낮춰서 메모리에 로드하는것이 효율적이다.

(저해상도 버전은 UI구성요소의 크기와 일치해야 한다.)

그렇기 때문에 작게 서브 샘플링한 버전을 메모리에 로드하여 메모리 제한을 초과하지 않고 큰 비트맵을 디코딩하는것이 바람직하다.


비트맵 크기 및 유형값 구하기 (해당 비트맵을 메모리에 로드하지 않고 사이즈 구하는 방법)

val options = BitmapFactory.Options().apply {
    inJustDecodeBounds = true
}
BitmapFactory.decodeResource(resources, R.id.myimage, options)
val imageHeight: Int = options.outHeight
val imageWidth: Int = options.outWidth
val imageType: String = options.outMimeType

해당 이미지를Bitmap으로 만들기위해서는 decodeByteArray(), decodeFile(), decodeResource() 등

의 메서드를 사용하는데 해당 메소드들은 생성된 비트맵에 메모리를 할당하기 때문에 OutOfMemory예외가 발생할 수 있다. 메모리 할당을 방지하는 방법에는 BitmapFcatory.Options Class의 inJustDecodeBounds값을 true로 설정해주는 방법이 있다.


축소 버전을 메모리에 로드

이미지 크기를 알면 전체 이미지를 메모리에 로드할것인지 서브샘플링된 버전을 대신 로드할것인지 결정할 수 있다.

고려해야 하는 요소

  1. 전체 이미지를 메모리에 로드할 때 예상되는 메모리 사용량
  2. 어플리케이션의 다른 메모리 요구사항을 고려하여 해당 이미지를 로드하는데 사용할 수 있는 메모리 용량
  3. 이미지가 로드되는 ImageView또는 UI구성요소의 크기
  4. 현재 기기의 화면 크기 및 밀도

1024x768px의 이미지를 128x96px의 ImageView에 로드 한다면 1024x768px의 이미지를 메모리에 로드하는것은 바람직하지 않다.


inSampleSize

2048x1536px의 해상도를 줄여 더 낮은 px의 비트맵을 생성할 수 있다.

ex)inSampleSize = 4인 경우 2048x1536의 해상도를 512x384의 크기의 비트맵을 생성한다.

12MB의 이미지를 0.75MB의 크기로 줄일 수 있음.

+ Recent posts