[kotlin] 카메라로 찍은 이미지 회전 현상 해결

엔초이·2021년 11월 9일
0

AndroidStudio

목록 보기
1/1

카메라나 갤러리 인텐트를 이용해 촬영한 사진을 가져와 이미지뷰에 띄우려는 경우, 이미지가 회전되는 현상이 발생한다.

방법을 찾아보다가, ExifInterface 클래스를 이용해 해결할 수 있었다.

1. 카메라 인텐트 실행 부분

val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
getCamera.launch(intent)

2. 사진 각도를 반환하는 exifOrientationToDegrees함수와 이미지 회전 함수 구현

  • ExifInterface.TAG_ORIENTATION으로 받아온 사진 각도를 그대로 사용해줘도 상관없지만, 이미지 회전 시 좀 더 간결하게 구현하기 위해 정수로 반환해주는 함수를 사용했다.
    //사진 각도 반환 함수
    fun exifOrientationToDegrees(exifOrientation: Int): Int {
        if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
            return 90
        } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
            return 180
        } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
            return 270
        }
        return 0
    }

    // 이미지 회전 함수
    private fun rotate(bitmap: Bitmap, degree: Int) : Bitmap {
        val matrix = Matrix()
        matrix.postRotate(degree.toFloat())
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix,true)
    }

3. 사진 선택 후 실행되는 registerForActivityResult 함수

  • ExifInterface.TAG_ORIENTATION은 사진의 회전 각도를 의미한다.
  • exifOrientationToDegrees 함수를 통해 받아온 사진 회전 각도의 Int값을 rotate 함수의 매개변수로 전달해 회전된 이미지를 받아온다.
//카메라 인텐트
    private val getCamera = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        if (it.resultCode == RESULT_OK) {
        ... 생략 ... 
            var bitmap = BitmapFactory.decodeFile(filePath, option)

            //meta data 저장하는 Exif
            val exif = filePath?.let { ExifInterface(filePath) }
            val exifOrientation: Int = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
            val exifDegree = exifOrientationToDegrees(exifOrientation)
            bitmap = rotate(bitmap, exifDegree)

            bitmap?.let {
                binding.userImageView.setImageBitmap(bitmap)
            }
        }
    }
profile
기록

0개의 댓글