프로필 수정기능을 구현하는 중입니다.
이 기능을 통해 서버는 폼 데이터 방식으로 개조를 위해 멀티파트를 사용하여 이미지 변경 및 닉네임 변경을 위한 값을 요청할 수 있으며, 수정된 닉네임 값과 인코딩된 이미지 값을 응답 값으로 전달합니다. 인코딩된 이미지 응답 값을 디코딩하여 Image Composable의 인자 값으로 입력합니다.
클라이언트는 서버로 form-data 방식으로 Multipart를 이용하여 이미지 변경 및 닉네임 변경을 위한 값을 보낼수 있으며, 응답값으로 수정된 닉네임 값과 인코딩된 string 형태의 이미지 값을 받습니다. 인코딩된 string 형태의 이미지 값을 디코딩 하여 Composable에서 Image의 painter에 전달할려고 합니다.
Android 앱의 이미지 합성 가능에서 사용하려면 String 응답 값을 BitMap 이미지로 다시 변환 하는 작업을 하고 있는데 Composable에서 Image의 painter에 전달하는 방법을 잘 모르겠어서 질문합니다.
API:

스크린 내 변수값:
val imageUri = rememberSaveable {
mutableStateOf<Uri?>(null)
}
val painter = rememberImagePainter(
data = imageUri.value,
builder = {
if (imageUri.value != null) {
placeholder(R.drawable.defaultprofile)
}
}
)
val launcher =
rememberLauncherForActivityResult(contract = ActivityResultContracts.GetContent()) { uri: Uri? ->
uri?.let {
imageUri.value = it
Log.v("image", "image: ${uri}")
}
}
val file = imageUri.value?.let { uri ->
val contentResolver = LocalContext.current.contentResolver
val inputStream = contentResolver.openInputStream(uri)
val tempFile = File.createTempFile("image", null, LocalContext.current.cacheDir)
tempFile.outputStream().use { outputStream ->
inputStream?.copyTo(outputStream)
}
tempFile
}
val requestFile = file?.asRequestBody("image/jpeg".toMediaTypeOrNull())
val body = requestFile?.let {
MultipartBody.Part.createFormData("image", file.name, requestFile)
}
이벤트 컴포저블:
TopAppBar(
title = {
Text(text = "프로필 수정")
},
actions = {
Text(
text = "완료",
modifier = Modifier
.padding(30.dp)
.clickable {
val currenNickname = MyApplication.prefs.getData("nickname", nickname)
if ((body != null) || !(nickname.equals(currenNickname))) {
changeNicknameAndProfile(token,
nickname,
body!!,
routeAction
) {
for (i in it!!.data.image) {
val base64String = i.toString()
val decodedBytes =
Base64.decode(base64String, Base64.DEFAULT)
val decodedImage = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size)
}
}
}
})
})
Spacer(modifier = Modifier.height(50.dp))
Image(
painter = painter,
contentDescription = "profileImage",
modifier = Modifier
.size(150.dp)
.padding(8.dp),
contentScale = ContentScale.Crop
)