와챠의 우당탕탕 코딩 일기장
갤러리에서 가져온 이미지가 회전되어져 있을 때(ExifInterface) 본문
갤러리에서 사진을 가져와 ImageView에 넣는 작업을 하고 있는데,
어떤 사진들이 회전되는 문제가 종종 있었다.
Camera 폴더에서 가져오는 사진이 주로 그런 것 같다.
사진을 찍을 때 카메라 회전 정보가 사진에 저장되어 있는 것이다.
예전엔 어떻게 해결할지 잘 몰랐는데 다시 구글링해보니까 그 방법이 은근히 쉬운 거다???
그래서 좀 당황........
암튼 갤러리에서 사진 선택하는 부분부터 소개를 하겠다...
1, 갤러리에서 사진 선택하기
버튼 누르면 갤러리에서 사진 선택하도록 했다.
binding.btnSelectImage.setOnClickListener {
// 갤러리에서 사진 선택해서 가져오기
val intent = Intent("android.intent.action.GET_CONTENT")
intent.type = "image/*" // 모든 이미지
getFromAlbumResultLauncher.launch(intent)
}
아래는 사진 선택 후 실행되는 코드이다.
uri에서 inputStram을 얻어 ExifInterface를 만들고,
사진 회전 정보를 가져와서 그만큼 다시 회전하도록 했다.
// 갤러리에서 사진 선택 후 실행
val getFromAlbumResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val uri = result.data?.data // 선택한 이미지의 주소
// 이미지 파일 읽어와서 설정하기
if (uri != null) {
// 사진 가져오기
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri))
// 사진의 회전 정보 가져오기
val orientation = getOrientationOfImage(uri).toFloat()
// 이미지 회전하기
val newBitmap = getRotatedBitmap(bitmap, orientation)
// 회전된 이미지로 imaView 설정
binding.imgView.setImageBitmap(newBitmap)
}
else binding.imgView.setImageResource(R.drawable.ic_launcher_background)
}
}
2, 사진이 회전된 정보 가져오기
ExifInterface는 이미지 파일의 Exif 데이터를 읽고 쓸 수 있다.
Exif? Exchangeable Image File Format, 이미지 파일 메타 데이터(다른 데이터를 설명해주는 데이터) 포멧이다.
Exif 데이터? 날짜, 시간, 사진 방향, 위치 등의 부가적인 데이터이다.
우리는 사용자가 선택한 사진의 uri에서 inputStream을 가져와이를 통해 ExifInterface를 생성할 것이다.이 ExifInterface 객체를 통해 사진의 방향 정보를 얻어오는 게 목적!!!
// 이미지 회전 정보 가져오기
@RequiresApi(Build.VERSION_CODES.N)
private fun getOrientationOfImage(uri: Uri): Int {
// uri -> inputStream
val inputStream = contentResolver.openInputStream(uri)
val exif: ExifInterface? = try {
ExifInterface(inputStream!!)
} catch (e: IOException) {
e.printStackTrace()
return -1
}
inputStream.close()
// 회전된 각도 알아내기
val orientation = exif?.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
if (orientation != -1) {
when (orientation) {
ExifInterface.ORIENTATION_ROTATE_90 -> return 90
ExifInterface.ORIENTATION_ROTATE_180 -> return 180
ExifInterface.ORIENTATION_ROTATE_270 -> return 270
}
}
return 0
}
3, 회전된 만큼 다시 회전시키기
2에서 회전된 정보를 알아왔으면
그 회전된 정도 만큼 사진을 회전하면 된다~~
// 이미지 회전하기
@Throws(Exception::class)
private fun getRotatedBitmap(bitmap: Bitmap?, degrees: Float): Bitmap? {
if (bitmap == null) return null
if (degrees == 0F) return bitmap
val m = Matrix()
m.setRotate(degrees, bitmap.width.toFloat() / 2, bitmap.height.toFloat() / 2)
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, m, true)
}
참고
https://juahnpop.tistory.com/233
https://m.blog.naver.com/nywoo19/221967495266
'코딩 일기장 > Android(Kotlin)' 카테고리의 다른 글
[Kotlin]let/with/run/apply/also (0) | 2022.02.08 |
---|---|
[Android/Kotlin]코루틴(Coroutine) 정리 (0) | 2022.02.07 |
Spinner 설정 (0) | 2022.01.25 |
Android 12 Splash + 앱 시작 시간 공부 (2) | 2022.01.24 |
[Android/Kotlin] recyclerview drag and drop/swipe 기능 만들기 (10) | 2021.08.26 |