와챠의 우당탕탕 코딩 일기장

갤러리에서 가져온 이미지가 회전되어져 있을 때(ExifInterface) 본문

코딩 일기장/Android(Kotlin)

갤러리에서 가져온 이미지가 회전되어져 있을 때(ExifInterface)

minWachya 2022. 1. 31. 14:41
반응형

갤러리에서 사진을 가져와 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

 

안드로이드 코틀린 : 사진의 Exif 데이터 읽기, 쓰기 - ExifInterface

Android Kotlin : Exif 데이터 읽기, 쓰기 - ExifInterface Exif는 디지털 카메라 등에 사용되는 이미지 메타데이터 포멧입니다. 이 포스트는 안드로이드 프로그래밍에서 이미지 파일의 Exif 데이터를 읽고

juahnpop.tistory.com

https://m.blog.naver.com/nywoo19/221967495266

 

[안드로이드] 갤러리에서 이미지 가져올 때 회전되는 현상 해결

갤러리에서 이미지를 가져와서 ImageView에 뿌려주는데 이미지가 이상하게 90도 회전되서 나오는 경우가 ...

blog.naver.com

 

반응형
Comments