모바일 앱(안드로이드)

안드로이드 앱 만들기 : Bitmap.createScaledBitmap 사용 예시

Billcorea 2022. 6. 25. 10:32
반응형

앱을 만들어 사용하다 보면 간혹 이미지를 받아와서 사용하게 되는 경우가 있게 된다. 그런데, 온라인으로 firebase 을 활용해 저장을 해 보려 하니, 저장 하고 받아오는 속도가 문제가 되는 것 같다.  여기서 사용되는 이미지는 그냥 참고를 위한 간략한 정보로만 사용되기 때문에 그 크기를 줄여 성능 이슈를 보완하는 것으로 방향을 선택 했다.

 

먼저 이미지는 어떻게 수집할 것 인가 ?  이 부분은 이전 게시한 글을 참고하길 바라며

https://billcorea.tistory.com/196

 

안드로이드 앱 만들기 : Jetpack Compose 에서 프로필 이미지 저장해 보기

앱을 만들다 보면 프로필 가져오기 기능을 구현해 보는 경우가 간혹 생긴 게 된다. 오늘은 compose을 이용한 구현을 하는 과정에서 갤러리에서 이미지를 불러와서 프로필 사진으로 저장하는 과정

billcorea.tistory.com

 

오늘은 불러온 이미지를 줄이는 방법에 대한 이야기를 해 볼까 한다.

 

bitmap.value?.let {  bitmap ->
    var btm = bitmap
    val baos = ByteArrayOutputStream()
    btm?.compress(
        Bitmap.CompressFormat.PNG,
        100,
        baos
    )
    val b: ByteArray = baos.toByteArray()
    jobRefImage.value = Base64.encodeToString(b, Base64.DEFAULT)
}

먼저 그냥 compress 을 해 보는 방법이다.  구글 검색을 통해서 얻은 내용으로는 compress 을 하는 건 이미지를 압축하기는 하지만, 크기가 변하지는 않는다. 요새 폰의 카메라른 워낙 성능이 좋아서 사진 크기가 5Mbyte을 넘어가는 경우도 있는데, 그 크기가 줄어 들지 않는 것이다. 그래서 이걸 그대로  byte type 으로 변환 해서 저장을 하고자 했더니,  모래시계만 뱅글 뱅글... 끝나지가 않았다.

 

private fun resizeBitmap(bitmap: Bitmap): Bitmap? {
    val resizeWidth = 512
    val aspectRatio = bitmap.height.toDouble() / bitmap.width.toDouble()
    val targetHeight = (resizeWidth * aspectRatio).toInt()
    val result: Bitmap = Bitmap.createScaledBitmap(bitmap, resizeWidth, targetHeight, false)
    if (result != bitmap) {
        bitmap.recycle()
    }
    return result
}


// 실제 함수 호출은 이렇게 해서 위에서 작성한 코드를 대체 하였다.
                 bitmap.value?.let {  bitmap ->
                    var btm = resizeBitmap(bitmap)
                    val baos = ByteArrayOutputStream()
                    btm?.compress(
                        Bitmap.CompressFormat.PNG,
                        100,
                        baos
                    )
                    val b: ByteArray = baos.toByteArray()
                    jobRefImage.value = Base64.encodeToString(b, Base64.DEFAULT)
                }

그래서 찾은 방법이 createScaledBitmap 함수 이다. 그 사용 방법은 위 내용과 같다. 이렇게 하면 이미지의 크기를 내가 원하는 크기로 조절하기 때문에 사이즈도 줄어 들고 firebase realtime database 에 byte type 을 저장을 하더라도 성능이 떨어지지 않는 것을 알게 되었다.

 

이미지가 적용된 앱 예시

 

반응형