일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스위프트 웹뷰
- 스위프트 카메라
- 노티피케이션 익스텐션
- 스위프트
- 안드로이드 앨범
- Swift flutterviewcontroller
- flutter rotate
- 안드로이드 숏컷
- 스위프트 푸시
- 안드로이드 바로가기
- Flutter UIKitView MethodChannel
- 플러터 뷰 컨트롤러
- NotificationService Extension
- Flutter NativeView
- swift 문자
- 앱 꺼졌을 때 푸시 데이터 저장
- 스위프트 앨범
- 앱 백그라운드 푸시 데이터 저장
- 스위프트 UserDefaults
- 스위프트 테이블 뷰 셀
- flutter 회전
- swift sms
- 푸시 데이터 저장
- silent push
- native flutter view
- swift autolayout
- 안드로이드 FCM
- 안드로이드 에러
- Swift flutterview
- FlutterView MethodChannel
- Today
- Total
Things take time
[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이 아닌 값들은 회전되어있는 것을 알 수 있고 필요한 작업을 수행하면 된다.
'Android(기능)' 카테고리의 다른 글
[Android] 앨범 가져올 때 주의점 및 코드 (0) | 2018.06.28 |
---|---|
[Android] 현재 디바이스의 너비/높이 얻어오기 (0) | 2018.05.25 |
[Android] 안드로이드 오레오(Oreo)이상 부터 사용 되는 바로가기(ShortCut) (0) | 2018.05.11 |
[Android] 최근 실행중인 앱 목록(Recent App)에서 앱을 실행함을 감지하는 방법 (0) | 2018.05.11 |
[Android] Activity를 스택에 쌓이지 않게 하는 방법 (0) | 2018.05.08 |