Kotlin

[Kotlin] ByteArray -> Bitmap Image Resize

eulBlue 2023. 8. 9. 23:44

📱테스트 환경

Samsung Galaxy Android 13 • Android 10


😢 내가 겪은 문제

DB에 저장되어있는 이미지를 가져와서 ImageView 에 넣고 wrap_content / wrap_content 해주고 크기를 봤는데 ...

너무 처참하게 작아서 잘 안보였다 .. 그래서 reSize 를 해주고싶었는데 잘 안됐다 .. 검색해서 이것저것 찾아봤는데

내 얇디얇은 지식으로는 이해하기 쉽지 않았다 ...!! 그래서 열심히 뒤져서 결국 해냈는데 해당 코드를 기록해 놓고 싶었다 : )

먼저 ByteArray Type 으로 넘어온 이미지를 Bitmap 형식으로 변환해주었다. 그래야 ImageView 에 넣어줄 수 있다 !!

val imageBitmap = BitmapFactory.decodeByteArray(imageByteArray, 0, imageByteArray.size)

이런 다음에 이제 Bitmap 을 ImageView 에 넣어주면 화면에 이미지를 확인할 수 있다.

원하는 넓이와 높이를 적어주면 해당 뷰에 원하는 크기로 이미지를 조정하여 볼 수있다.

val imageView = findViewById<ImageView>(R.id.ImageView)

imageView.setImageBitmap(Bitmap.createScaledBitmap(imageBitmap, 원하는 넓이, 원하는 높이, false))

하지만, 내가 원하는건 넓이는 화면 전체 크기에 맞추고, 높이는 비율에 맞게 조절하고싶었다.

해서 열심히 계산을 돌려서 넓이는 부모의 넓이, 높이는 비율에 맞게 커지되, 최대높이에서 130dp 를 뺀 만큼 커지게 변경하였다.

최종 코드는 이렇다 : )

val pullScreen = findViewById<ConstraintLayout>(R.id.pullScreen)
val imageView = findViewById<ImageView>(R.id.ImageView)

// 부모 뷰의 너비와 높이 가져오기
val parentWidth: Int = pullScreen.width
val parentHeight: Int = pullScreen.height

// 이미지의 원래 너비와 높이 가져오기
val originalWidth = imageBitmap.width
val originalHeight = imageBitmap.height

// 비율 계산
val aspectRatio = originalWidth.toFloat() / originalHeight

// 새로운 높이와 너비 계산
val newWidth = parentWidth
var newHeight = Math.round(parentWidth / aspectRatio)

// 최대 높이 제한
val maxHeightPixels = pullScreen.height - TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 130f, resources.displayMetrics).toInt()

if (newHeight > maxHeightPixels) {
	newHeight = maxHeightPixels
}


imageView.setImageBitmap(Bitmap.createScaledBitmap(imageBitmap, newWidth, newHeight, false))

이렇게 해서 DB 에서 가져온 ByteArray 를 Bitmap 으로 변경하고, 비율에 맞게 내가 원하는 형태로 변경하여 이미지를 보여주었다.

첨엔 정말 간단하게 해결할 수 있을 것 같았는데, 생각보다 시간이 걸린 걸 봐서는 더 열심히 공부해야겠다 .... :(