반응형
이미지 저장시 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 데이터를 쉽게 얻을 수 있습니다.
이미지 백업 관련한 포스팅은 추후 업로드하여 본 포스팅에 링크 추가하도록 하겠습니다.
감사합니다.
반응형
'안드로이드 > 코틀린' 카테고리의 다른 글
[Android] 다크 테마 적용하기 (0) | 2023.08.03 |
---|---|
[Android] Room 초기 데이터 설정 (0) | 2023.05.02 |
[AOS] 서드파티 앱을 이용하여 이메일 전송하기 & 앱내 문의하기 기능 구현 (0) | 2022.06.29 |
[AOS] Retrofit Response 동적 파라미터 Type으로 받기 (0) | 2022.06.21 |
[Kotlin] Filter 함수로 For문 대체하기 (0) | 2022.05.01 |