카메라나 갤러리 인텐트를 이용해 촬영한 사진을 가져와 이미지뷰에 띄우려는 경우, 이미지가 회전되는 현상이 발생한다.
방법을 찾아보다가, ExifInterface 클래스를 이용해 해결할 수 있었다.
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
getCamera.launch(intent)
//사진 각도 반환 함수
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)
}
//카메라 인텐트
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)
}
}
}