• [Android | Kotlin] Uri로 입력받은 이미지를 줄이는 방법

    2023. 6. 4.

    by. 하루플스토리

    반응형

    안녕하세요, 하루플입니다.

     

    스마트폰의 기본 카메라로 사진을 촬영하게 되면 최신 스마트폰의 경우 10~20MB의 용량을 차지하는 경우도 많습니다.

    최근 출시한 갤럭시 S23울트라의 경우 2억화소를 지원하게 되면서 30MB를 넘는 고용량의 사진을 촬영할 수 있게 되었습니다.

    하지만 우리가 앱을 개발하면서 서버에 업로드 할 때 굳이 이정도로 고용량의 사진이 필요하지 않을 수도 있습니다.

     

    예를 들어 인스타그램이나 페이스북의 경우 사진의 원본을 저장하지 않고 어느정도 용량을 다운시킨 상태로 가지고 있는 것을 확인할 수 있습니다.

    저같은 경우도 개인 앱 서비스를 개발하다보니 서버 비용에 한계가 있고 업로드 하는 속도도 최적화를 하기 위해서 이미지를 줄이는 방법을 고민했었습니다.

    인스타그램과 비슷한 기능을 개발하면서 사진을 서버에 업로드 해보니 사진용량이 너무 크더라구요..

    Firebase 용량이 급속도로 차는 것을 확인했습니다..

    이대로면 많은 유저가 사용하였을 때 엄청난 요금 폭탄을 맞을 수도 있습니다..

    서버에 업로드된 사진 용량은 무려 한장당 10MB 입니다.

     

     

    이를 줄이기 위해 아래의 함수를 만들었습니다.

    private fun convertResizeImage(imageUri: Uri): Uri {
        val bitmap = MediaStore.Images.Media.getBitmap(requireContext().contentResolver, imageUri)
        val resizedBitmap = Bitmap.createScaledBitmap(bitmap, bitmap.width / 2, bitmap.height / 2, true)
    
        val byteArrayOutputStream = ByteArrayOutputStream()
        resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, byteArrayOutputStream)
    
        val tempFile = File.createTempFile("resized_image", ".jpg", requireContext().cacheDir)
        val fileOutputStream = FileOutputStream(tempFile)
        fileOutputStream.write(byteArrayOutputStream.toByteArray())
        fileOutputStream.close()
    
        return Uri.fromFile(tempFile)
    }

    1. 이미지 Uri를 Bitmab 형식으로 변환합니다.

    2. 변환한 Bitmap 이미지의 사진 사이즈를 지정합니다. 저는 1/2 사이즈로 줄여도 앱 사용상 품질에 문제가 없었기 때문에 가로 세로 사이즈를 절반식 줄였습니다. 결과적으로 넓이는 4배가 줄어들게 되었습니다.

    3. 이미지 압축 품질을 설정합니다. 저는 기존의 90%로 압축하도록 하였습니다. (10% 압축률 설정)

    4. 임시폴더인 tempFile에 방금 만든 비트맵 이미지를 저장합니다.

    5. tempFile에 있는 이미지의 Uri를 리턴합니다.

     

    4번에서 저는 tempFile을 사용했는데 일반적으로 사용하는 방법인 비트맵 이미지를 File에 그대로 저장해버리면 갤러리에 필요없는 이미지가 하나 더 생겨버리게 됩니다. 그리고 해당 이미지의 Uri를 가져오게 되는 방식으로 작동하게 됩니다.

    저는 굳이 이미지를 하나 더 갤러리에 생성할 필요가 없기 때문에 temp에 저장하는 형식으로 개발하였습니다.

     

    해당 방식으로 이미지의 사이즈를 줄이고 난 후 Firebase에 업로드 된 사진 용량을 확인해보았습니다.

    이미지의 용량이 크게 줄어든 것을 확인할 수 있습니다.

     

    반응형

    댓글