Kwaang Tech

[Android/kotlin] 사진이 자꾸 회전 하는 현상 본문

Dev/TroubleShooting

[Android/kotlin] 사진이 자꾸 회전 하는 현상

콰앙 2024. 4. 10. 11:40

Camera X를 사용하여, 사진을 찍고, 흑백으로 출력했을때, 사진이 자꾸 돌아간다.


사진을 찍고, 그 사진을 ImageView에 넣는거 까진 잘 들어갔는데, 
흑백을 주게 되면, 저렇게 사진이 돌아가는 현상이 나타났다.

 

사진이 회전하는 이유는 일반적으로 이미지의 EXIF 메타 데이터와 디바이스의 방향 설정 사이의 불일치 때문이라고 한다. 즉, 사진의 원본 방향과, 디바이스의 방향이 서로 달라, 흑백으로 효과를 주는 과정에서 이미지의 회전 여부에 대한 처리가 제대로 이루어지지 않은 것 같다.


Exif란?
Exif(Exchangeable Image File Format)은 디지털 카메라 등에서 이용되는 이미지 파일 메타데이터 포멧이다. 메타데이터란 다른 데이터를 설명해주는 데이터라고 말할 수 있다. 즉, Exif 데이터는 이미지데이터(좌표와 색데이터)를 제외한 이미지를 설명해주는 날짜와 시간 정보, 사진의 방향, 위치 정보, 카메라 조리게 등의 부가적인 데이터를 말한다. 이런 다양한 데이터가 Exif란 형태 구조화되어 JPEG와 같은 이미지 파일에 함께 저장된다.


사진에서 Exif 데이터를 보기 위해서는 ExifInterface를 사용한다.

 


흑백으로 전환하기전에, exif메타데이터 값을 불러와, rotate값을 읽은 후, 다시 돌려주면 된다.

몇번 구글링을 해 보면, 이와 같은 사례는 많이 나온다.

fun rotateBitmapIfNeeded(bitmap: Bitmap, imagePath: String): Bitmap {
        val exif = ExifInterface(imagePath)
        val orientation = exif.getAttributeInt(
            ExifInterface.TAG_ORIENTATION,
            ExifInterface.ORIENTATION_NORMAL
        )
        val rotationAngle = when (orientation) {
            ExifInterface.ORIENTATION_ROTATE_90 -> 90
            ExifInterface.ORIENTATION_ROTATE_180 -> 180
            ExifInterface.ORIENTATION_ROTATE_270 -> 270
            else -> 0
        }
        val matrix = Matrix()
        if (rotationAngle != 0) {
            matrix.postRotate(rotationAngle.toFloat())
        }
        return Bitmap.createBitmap(
            bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true
        )
    }

 

이 함수를 먼저 부른 후에, 흑백으로 변환하면, 사진이 돌아 가지 않는다.

반응형