앱을 만들어 사용하다 보면 간혹 이미지를 받아와서 사용하게 되는 경우가 있게 된다. 그런데, 온라인으로 firebase 을 활용해 저장을 해 보려 하니, 저장 하고 받아오는 속도가 문제가 되는 것 같다. 여기서 사용되는 이미지는 그냥 참고를 위한 간략한 정보로만 사용되기 때문에 그 크기를 줄여 성능 이슈를 보완하는 것으로 방향을 선택 했다.
먼저 이미지는 어떻게 수집할 것 인가 ? 이 부분은 이전 게시한 글을 참고하길 바라며
https://billcorea.tistory.com/196
오늘은 불러온 이미지를 줄이는 방법에 대한 이야기를 해 볼까 한다.
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 을 저장을 하더라도 성능이 떨어지지 않는 것을 알게 되었다.
'모바일 앱(안드로이드)' 카테고리의 다른 글
안드로이드 앱 만들기 : local.properties 의 활용 API 키 숨기기 (0) | 2022.07.11 |
---|---|
안드로이드 앱 만들기 : 나의 앱도 다국적 앱이 되어 본다. (언어설정) (9) | 2022.07.05 |
안드로이드 앱 만들기 : 연일 검증에서 퇴짜를 맞다... (4) | 2022.06.22 |
안드로이드 앱 만들기 : Dokka 는 뭔가 ? (0) | 2022.06.20 |
안드로이드 앱 만들기 : Firebase Clound Messaging ... (0) | 2022.06.19 |