Things take time

[Android] Image파일의 회전 값 알아오기 본문

Android(기능)

[Android] Image파일의 회전 값 알아오기

겸손할 겸 2018. 5. 24. 17:04

[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이 아닌 값들은 회전되어있는 것을 알 수 있고 필요한 작업을 수행하면 된다.