[Android] Image파일의 회전 값 알아오기
[ExifInterface]
ExifInterface란 이미지가 갖고 있는 정보의 집합 클래스다. 이미지가 갖고 있는 상세정보를 추출할 때 필요하다.
단순히 이미지가 갖고 있는 크기가 궁금하다면 BitmapFactory를 이용하여 getWidth() 및 getHeight()를 사용하여 해상도를 추출할 수 있으나, 만약 그 이미지가 회전값을 갖고 있어서(세로로 찍은 사진, 가로로 찍은 사진) 다른 각도의 사진인데도, 해상도가 동일하게 리턴하는 문제가 발생되었다.
이럴때는 회전된 이미지라면 원래 이미지로 돌리거나, 계산해서 해상도를 다시 바꿔주는 등의 작업이 필요하다.
나 같은 경우에는 앨범에서 사진을 호출했을 때 결과 값을 얻어오는 과정에서 이 작업을 수행했다.
도큐먼트 : https://developer.android.com/reference/android/media/ExifInterface
[코드]
try { ExifInterface exif = new ExifInterface(f.getAbsolutePath()); int exifOrientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); Log.i("gallery orientation", String.valueOf(exifOrientation)); int exifDegree = exifOrientationToDegrees(exifOrientation); Log.i("gallery orientation", String.valueOf(exifDegree)); if (exifDegree == 90 || exifDegree == 270){ String priorMsgImgWidth = msgImgWidth; msgImgWidth = msgImgHeight; msgImgHeight = priorMsgImgWidth; } } catch (Exception e){ Log.e("error", e.toString()); }
ExifInterface의 생성자 파라미터로는 해당 파일의 경로 String값을 넣어주는 것이고, getAttributeInt를 통해 정해진 상수값을 전달하여 회전 값을 얻어낼 수 있다.
여기서 f는 File 클래스 변수를 의미한다. 당연히 해당 이미지 파일을 가져왔을 때를 가정한다.
안에 들어가는 태그 값들은 ExifInterface.TAG_XXXX로 되는 값들을 찾아보면 무수히 많다.
그리고 리턴되는 exifOrientation의 값에 따라 분기처리를 하게 되는데,
private int exifOrientationToDegrees(int exifOrientation) { 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; }
이런식으로 리턴되는 int값을 각도 값으로 변환할 수 있다.
그래서 0이 아닌 값들은 회전되어있는 것을 알 수 있고 필요한 작업을 수행하면 된다.