25.1.0 Support Library가 출시됨에 따라 제품군에 ExifInterface Support Library가 새롭게 추가되었습니다. Android 7.1에서 프레임워크의
ExifInterface
에 상당히 향상된 기능이 도입되면서, Support Library의
ExifInterface
를 통해서는 모든 API 9 이상의 기기에서만 이러한 기능을 사용할 수 있습니다.
기본적인 사항은 종전과 같습니다. 이미지 파일에 포함된
Exif 태그를 여전히 읽고 쓸 수 있습니다. 하지만 이제는 카메라 자체, 카메라 설정, 방향 및 GPS 좌표 관련 정보를 비롯하여 140가지의 다양한 속성을 포함합니다(그 중 거의 100개는 Android 7.1/이 Support Library에 새로 추가된 것임).
카메라 앱: Exif 속성 쓰기
카메라 앱에서는 아마도 쓰기가 가장 중요한 기능일 것입니다. 속성 쓰기는 여전히 JPEG 이미지 파일로 제한됩니다. 대개의 경우 실제 카메라 캡처 작업 중에는 이 기능을 사용할 필요가 없습니다. 대신,
JPEG_ORIENTATION
,
JPEG_GPS_LOCATION
또는 Camera1
Camera.Parameters
에서 이에 상응하는 속성과 함께 Camera2 API
CaptureRequest.Builder.set()
를 호출합니다. 하지만
ExifInterface
를 사용하면 사후에 파일을 변경할 수 있습니다(예컨대, 사용자 요청 시 위치 정보 제거).
Exif 속성 읽기
하지만 누군가에게는 이런 속성을 읽는 것이 가장 기본적인 작업일 수 있으며, 따라서 이 부분이 가장 크게 개선되었다고 볼 수도 있습니다.
먼저 JPEG 및 원시 이미지(특히, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW 및 RAF 파일)에서 Exif 데이터를 읽을 수 있습니다. 이는 실제로는 중대한 구조적 변경 작업이었습니다. 모든 네이티브 종속 항목을 제거하고 모든 기능이 실제로 작동하는지 확인하기 위해 광범위한 테스트 세트를 빌드해야 했기 때문입니다.
content://
URI로 다른 앱에서 이미지(예:
API 24 이상을 대상으로 하는 앱에서 전송한 이미지)를 수신하는 앱의 경우,
ExifInterface
는 이제 InputStream
에서 직접 작동합니다. 따라서 임시 파일을 생성할 필요 없이 수신하는
content://
URI에서 바로 Exif 정보를 손쉽게 추출할 수 있습니다.
Uri uri; // the URI you've received from the other app
InputStream in;
try {
in = getContentResolver().openInputStream(uri);
ExifInterface exifInterface = new ExifInterface(in);
// Now you can extract any Exif tag you want
// Assuming the image is a JPEG or supported raw format
} catch (IOException e) {
// Handle any errors
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ignored) {}
}
}
참고:
ExifInterface
는 원격
InputStream
(예:
HttpURLConnection
에서 반환되는 InputStream)과는 작동하지 않습니다.
content://
또는
file://
URI로만 사용하세요.
대부분의 속성에는 단순히
getAttributeInt()
,
getAttributeDouble()
또는
getAttribute()
(문자열의 경우) 메서드 중 적합한 메서드를 사용하면 됩니다.
이미지 표시와 관련하여 가장 중요한 속성 중 하나는 이미지 방향입니다. 이 속성은 적절한 이름의
TAG_ORIENTATION
에 저장되어 있으며
ORIENTATION_
상수 중 하나를 반환합니다. 이 값을 후처리하여 회전 각도로 변환할 수 있습니다.
int rotation = 0;
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotation = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotation = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotation = 270;
break;
}
특정 Exif 태그에서 값을 추출하는 도우미 메서드가 몇 가지 있습니다. 위치 데이터의 경우,
getLatLong()
메서드는 위도와 경도를 부동 소수점 값으로 제공하며
getAltitude()
는 고도를 미터 단위로 제공합니다. 일부 이미지는 작은 썸네일 이미지도 포함합니다.
hasThumbnail()
을 사용하여 썸네일 이미지가 있는지 여부를 확인한 후
getThumbnail()
을 사용하여
BitmapFactory.decodeByteArray()
로 전달하는 데 가장 적합한 형식인 썸네일 이미지의
byte[]
표현을 추출할 수 있습니다.
Exif 작업: 모든 것이 선택 사항
Exif 데이터와 관련하여 이해해야 할 가장 중요한 점 한 가지는 필수 태그가 없다는 점입니다. 각각의 태그가 모두 선택 사항입니다. 일부 서비스는 특히 Exif 데이터를 제거하기도 합니다. 따라서 Exif 데이터를 전혀 지원하지 않는 이미지 형식(예컨대 흔한 PNG 또는 WebP 이미지)이나 특정 속성에 대한 데이터가 없는 이유로 인해 Exif 데이터가 없는 경우를 코드 전체에서 항상 적절히 처리해야 합니다.
ExifInterface Support Library를 다음 종속 항목과 함께 프로젝트에 추가하세요.
compile "com.android.support:exifinterface:25.1.0"
이미지가 잘못 회전되어 표시되는 것을 막는것이 목적이라면 ExifInterface Support Library가 더 나은 앱을 만들 수 있도록 도와줄 것입니다.
▶ 원문 링크