[kotlin]カメラで撮影した画像の回転問題を解決する


カメラやライブラリテントで撮影した写真を使って、画像ビューに表示しようとすると、画像が回転する現象が発生します.
メソッドを探す過程でExifInterfaceクラスを用いてこの問題を解決した.

1.カメラテント実行部

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

2.ExifOrientation ToDegrees関数と画像回転関数を実現して写真角度を返す

  • 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.写真を選択して実行するregisterForActivity Result関数

  • ExifInterface.TAG ORIENTATIONは写真の回転角度を表します.
  • exiforientationToDegrees関数により、受信した写真の回転角度のInt値が回転関数のパラメータとして伝達され、回転する画像が受信される.
  • //카메라 인텐트
        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)
                }
            }
        }