Retrofit2를 이용해서 서버로부터 Content-type이 image/jpeg로 이미지를 받아 Bitmap 객체로 처리하기

2019. 11. 5. 16:02Programming/Android

반응형

API를 호출했을 때 Content-typeimage/jpeg로 설정되는 경우, 응답에 JPEG파일이 실려오게 된다. 크롬의 개발자 도구에서 네트워크 탭을 통해 응답을 확인해보면, 실제로 이미지 파일이 응답 본문(Response Body)에 실려오는 것을 볼 수 있다. 그렇다면 Android에서 Retrofit2를 이용하여, 이러한 Bitmap을 처리하려면 어떻게 해야할까?

우선은 아래와 같이 interface를 작성해준다. 파일 용량이 적을 경우에는 @Streaming을 생략해도 잘 동작한다. Call에 넘겨주는 ResponseBodyokhttp3패키지의 ResponseBody이다.

JAVA를 사용하여 작성한 코드

public interface DonwloadImage {
 @GET("images/{apiName}")
 @Streaming //용량이 적을 경우 @Streaming은 생략이 가능하다.
 Call<ResponseBody> downloadImage(@Path("apiName") String apiName);
}

KOTLIN을 사용하여 작성한 코드

interface DownloadImage {
 @GET("images/{apiName}")
 @Streaming //용량이 적을 경우 @Streaming은 생략이 가능하다.
 downloadImage(@Path("apiName") apiName:String):Call<ResponseBody>;
}

interface를 작성했다면 Retrofit2를 이용하여 API를 호출해주면 된다. 응답을 받아서 Bitmap 객체를 이용해 이미지를 처리하려면, 다음과 같이 코드를 작성하자. 이미지의 로우 데이터는 response.body()byteStream으로 읽어들여서, BitmapFactory.decodeStream으로 디코딩하면 Bitmap 객체가 반환된다. 이제 처리가 끝난 Bitmap 객체를 이용해 저장하거나 화면상에 띄우는 작업을 할 수 있다.

JAVA를 사용하여 작성한 코드

new Callback<ResponseBody>(){
 @Override
 public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
   InputStream is = response.body().byteStream();
   Bitmap bitmap = BitmapFactory.decodeStream(is);
 }
}

KOTLIN을 사용하여 작성한 코드

object: Callback<String> {
   override fun onResponse(call: Call<String>, response: Response<String>) {
     val is = response.body().byteStream()
     val bitmap = BitmapFactory.decodeStream(is)
   }
}

같은 방법으로 서버에서 파일을 다운받아, 클라이언트에 저장하는 등의 처리도 가능하다. 해당 내용은 How to download Files from server - Future Studio의 내용을 참조하도록 하자.

참조

Retrofit 2 download image and save to folder - StackOverflow
How to download Files from server - Future Studio

반응형