💡 이미지를 가져와서 처리하는 방법은 다양합니다. 인터넷에 검색해보면 많은 사람들이 갤러리를 열고 이미지를 선택하면 onActivityResult()에서 처리하는 방식을 사용하는데, 저는 갤러리를 사용하지 않고 이미지를 가져오는 방법을 해보겠습니다.
❗️ 지극히 제가 알아듣게 작성한 포스트입니다.
Type이 Bitmap인 이미지들을 리스트에 넣어주고, 이 리스트를 어뎁터로 넘겨 recyclerView에 보여주는 방식입니다.
private fun getImage() {
val projection = arrayOf(MediaStore.Images.ImageColumns._ID)
val cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC")
for (i in 0 until cursor!!.count) {
cursor!!.moveToPosition(i)
val id = cursor!!.getLong(0)
val image = getThumbnail(id)
images.add(image)
}
cursor!!.close()
setAdapter()
}
cursor를 통해 이미지에 접근하여 id를 통해 이미지의 bitmap을 가져와주는 작업입니다.
private fun getThumbnail(id: Long): Bitmap {
val options = BitmapFactory.Options()
options.inDither = true
options.inSampleSize = 2
options.inPreferredConfig = Bitmap.Config.RGB_565
var bit = MediaStore.Images.Thumbnails.getThumbnail(
contentResolver,
id,
MediaStore.Images.Thumbnails.MINI_KIND,
options
)
return ThumbnailUtils.extractThumbnail(bit, 100, 100, ThumbnailUtils.OPTIONS_RECYCLE_INPUT)
}
options의 isSampleSize가 작을수록 빠르게 가져올 수 있으나, 화질이 저하됩니다.
이렇게 이미지를 가져와서 recyclerView에서 보여주면 됩니다.
이게 인터넷을 사용하지 않고, 내부 저장소에서 가져오는 작업이라 이미지가 많으면 로딩이 오래걸릴지 안걸릴지 모르겠지만,
현재는 전체를 한번에 가져오는 중입니다.
이를 페이징 처리나 코루틴을 통하여 비동기적으로 처리하면 더 빠르지 않을까 생각들어 그렇게 해볼 생각입니다.