Retrofit2를 이용해서 서버로부터 Content-type이 image/jpeg로 이미지를 받아 Bitmap 객체로 처리하기
API를 호출했을 때 Content-type
이 image/jpeg
로 설정되는 경우, 응답에 JPEG
파일이 실려오게 된다. 크롬의 개발자 도구에서 네트워크 탭을 통해 응답을 확인해보면, 실제로 이미지 파일이 응답 본문(Response Body)에 실려오는 것을 볼 수 있다. 그렇다면 Android에서 Retrofit2
를 이용하여, 이러한 Bitmap을 처리하려면 어떻게 해야할까?
우선은 아래와 같이 interface
를 작성해준다. 파일 용량이 적을 경우에는 @Streaming
을 생략해도 잘 동작한다. Call
에 넘겨주는 ResponseBody
는 okhttp3
패키지의 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