[Kotlin] 갤러리 열지 않고, 이미지 가져오기

Hand·2022년 10월 4일
0

Android

목록 보기
14/17

💡 이미지를 가져와서 처리하는 방법은 다양합니다. 인터넷에 검색해보면 많은 사람들이 갤러리를 열고 이미지를 선택하면 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에서 보여주면 됩니다.

다음 고려할 점

이게 인터넷을 사용하지 않고, 내부 저장소에서 가져오는 작업이라 이미지가 많으면 로딩이 오래걸릴지 안걸릴지 모르겠지만,
현재는 전체를 한번에 가져오는 중입니다.
이를 페이징 처리나 코루틴을 통하여 비동기적으로 처리하면 더 빠르지 않을까 생각들어 그렇게 해볼 생각입니다.

profile
화이팅!

0개의 댓글