🎉 개요
안드로이드에서 서버측에 이미지를 받는 과정에서 Base64로 인코딩하여 전달 받습니다. 이 과정에서 이미지 처리가 정확히 어떻게 이루지는 것인지 한번 알아보겠습니다.
🎉 이미지 전송
갤러리에서 가져온 이미지의 Uri를 절대 경로로 반환합니다. 상대 경로를 사용하는 이유는 상대 경로보다 절대 경로를 사용하는 것이 더 정확하다고 하네요!
// 절대경로 변환
fun absolutelyPath(path: Uri, context : Context): String {
val proj: Array<String> = arrayOf(MediaStore.Images.Media.DATA)
val c: Cursor? = context.contentResolver.query(path!!, proj, null, null, null)
val index = c?.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
c?.moveToFirst()
val result = c?.getString(index!!)
return result!!
}
서버측에 전송할 enctype 은 Multipart입니다.
@Multipart
@POST("/db/upload") // 서버 엔드포인트 URL, HTTP POST 요청
suspend fun registStore(
@Part storeimage: MultipartBody.Part, // 이미지 데이터를 나타내는 파라미터
@Part("storename") storename: RequestBody,
@Part("ceoName") ceoName: RequestBody,
@Part("CRN") CRN: RequestBody,
@Part("contact") contact: RequestBody,
@Part("address") address: RequestBody,
@Part("latitude") latitude: RequestBody,
@Part("longitude") longitude: RequestBody,
@Part("kind") kind: RequestBody
): ResponseBody
- file : 절대 경로로 가져온 이미지를 통해 File 객체를 생성합니다.
- requestFile : 파일을 RequestBody로 변환합니다. image/*는 파일의 MIME 타입을 나타내며, 이 경우에는 이미지 파일을 나타냅니다.
- body : Retrofit interface에 POST Request에서 storeImage의 Type이 MulitpartBody.part로 지정되어있습니다. 그러므로 최종 Data Type은 Multipartbody.Part Type이여야 합니다.
val file = File(absolutelyPath(imgUri, context))
val requestFile = file.asRequestBody("image/*".toMediaTypeOrNull())
val body = MultipartBody.Part.createFormData("storeimage", file.name, requestFile)
🎉 이미지 받기
저는 서버에서 이미지를 전송할 때 Base64로 인코딩하여 전송하였습니다. Base64란 무엇일까요 ?
- 이진 데이터를 텍스트로 인코딩합니다. 이진 데이터를 ASCII 문자로만 이루어진 문자열로 변환합니다
- 주로 바이너리 데이터를 텍스트 형식으로 전송하거나 저장할 때 사용됩니다.
fun StringToBitmaps(image: String): Bitmap? {
try{
val encodedByte: ByteArray = Base64.decode(image, Base64.DEFAULT);
val bitmap: Bitmap = BitmapFactory.decodeByteArray(encodedByte, 0, encodedByte.size)
return bitmap
}catch (e: Exception){
Log.d("StringToBitmaps", "$e")
return null
}
}
- 서버에서 Base64로 전송한 데이터를 디코딩하여 ByteArray로 변환합니다.
- 디코딩된 이미지를 Bitmap 객체로 변환합니다.
'Android' 카테고리의 다른 글
[Android]Android Memory Process (1) | 2024.01.07 |
---|---|
Android Daum 우편번호 서비스 API With FireBase Hosting (2) | 2024.01.04 |
Anroid Jetpack [ ViewBinding ] (0) | 2024.01.02 |
Android LayoutInflater (1) | 2023.12.26 |
Android Fragment Life Cycle (0) | 2023.12.26 |