본문 바로가기

안드로이드/코틀린

[AOS] Room 사용시 이미지 비트맵으로 저장하기

반응형

이미지 저장시 Bitmap으로 저장하면 백업 파일을 만들어 디바이스간 데이터 이동 기능을 구현할 수 있습니다.

저는 백업 기능을 염두에 두지 않고 작업하다 보니 앱 내부 스토리지에 저장된 이미지의 경로를 저장하는 방식을 사용했습니다.
앱 전용 내부 디비가 있어서 사진첩에서 사진을 지워도 이미지는 보존되지만 앱을 삭제하면 되돌릴수 없기 때문에 필요에 맞게 선택하시면 될것 같습니다.

Plant Table

   @Entity(tableName = "plant")
    data class Item(
        @PrimaryKey(autoGenerate = true) var id: Long? = null,
        var name: String = "",
        var nickName: String = "",
        var image: Bitmap? = null,
    )

식물 테이블 클래스로 Bitmap 타입의 image를 관리합니다. 실질적으로 저장되는 타입은 ByteArray로 TypeConvert를 사용하여 Bitmap -> ByteArray로 변환하여 저장합니다. ( Room에서는 기본형 이외의 자료를 저장하기 위해서는 TypeConvert를 사용합니다. ) 

 

TypeConvert

class RoomTypeConverter {

    // Bitmap -> ByteArray 변환
    @TypeConverter
    fun toByteArray(bitmap : Bitmap) : ByteArray{
        val outputStream = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
        return outputStream.toByteArray()
    }

    // ByteArray -> Bitmap 변환
    @TypeConverter
    fun toBitmap(bytes : ByteArray) : Bitmap{
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
    }
}

TypeConvert는 기본 자료형 이외의 자료를 저장할때 형변환을 자동으로 해주는 코드 입니다.

 

DB.kt

@Database(
    version = 1,
    entities = [PlantData.Item::class]
)
@TypeConverters(RoomTypeConverter::class)
abstract class DB : RoomDatabase() {
	....
}

작성한 TypeConvert를 DB클래스에 추가하면 Bitmap 형태를 ByteArray로 변환해서 Room에 저장하고, 저장된 데이터를 호출할땐 ByteArray를 Bitmap 형태로 변환해줍니다. 

보다 자세한 사용법은 공식 문서나 다른 포스팅을 참고해주세요 ! 

 

Uri To Bitmap

    private fun setImageBitmap(uri: Uri){
        val bitmap = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
           ImageDecoder.decodeBitmap(
                ImageDecoder.createSource(contentResolver, uri)
            )
        }else{
            MediaStore.Images.Media.getBitmap(contentResolver, uri)
        }
    }

사진첩에서 사진을 선택하거나 카메라로 찍은 이미지를 파일화 시켜서 uri 데이터를 쉽게 얻을 수 있습니다. 

 

 

이미지 백업 관련한 포스팅은 추후 업로드하여 본 포스팅에 링크 추가하도록 하겠습니다.

감사합니다.

반응형