2012-11-28 2 views
38

Android 앱에서 기기 카메라를 사용하여 사진을 찍은 다음 크기를 조정하면 (업로드 크기를 줄이는 것이 매우 일반적 임) 이 크기 조정 작업 을 exif 메타 데이터로 제거한다는 것을 인식하지 못합니다.Android 이미지 EXIF ​​데이터 크기 조정 및 보존 (방향, 회전 등)

이 문제는 특히 문제의 장치가 'Orientation'태그를 사용하여 올바르게 이미지를 올바르게 표시하는 데 문제가 될 수 있습니다.

다른 Android 기기는 다양한 방식으로 카메라/이미지 회전을 처리합니다. 신뢰할 수있는 'Nexus One은 항상 캡처 한 이미지를 회전시키는 것처럼 보입니다. 따라서 파일의 기본 콘텐츠는 항상'수직 '으로 보입니다. 그러나 다른 장치 (특히 내 테스트에서 삼성 휴대폰), 아니 이미지 파일의 내용을 회전 - 오히려, 그들은 exif '오리 엔테이션'태그를 설정합니다. 이미지가 나중에 표시 될 때마다 관련 이미지 코드가 오리 엔테이션 '태그'의 존재를 감지하고 이미지를 적절히 회전해야합니다. 그러나 이미지에서 비트 맵 처리를 수행하여 새 파일에 저장하면 해당 exif 데이터는 모두 손실됩니다. 등 방향 데이터뿐만 아니라, 당신은 또한 메이크업/모델로 다른 가치있는 메타 데이터가 손실 될 수 있습니다

,

전화 갤러리에 표시 할 때 이미지가 수직으로 나타납니다 (몇 주 동안 저를 혼동하지만, 다음에 도착 잘못된 방향 및 명백한 메타 데이터가없는 내 서버). 다른 사람들을 돕기 위해이 자기 질문을 여기에 추가하고 있습니다. 이 블로그 게시물 매우 도움이되었다 :

http://vikaskanani.wordpress.com/2011/07/17/android-re-size-image-without-loosing-exif-information/

답변

15

다른 사람들이 지적했듯이, 당신은 최종 크기를 조정할 이미지 원본 이미지에서 EXIF ​​데이터를 복사해야합니다. 일반적으로 Sanselan Android 라이브러리가 가장 적합합니다. Android OS 버전에 따라 ExifInterface가 EXIF ​​데이터를 손상시킬 수 있습니다. 또한 ExifInterface는 제한된 수의 Exif 태그, 즉 "알고있는"태그 만 처리합니다. 한편 Sanselan은 모든 EXIF ​​태그와 마커 메모를 유지합니다. http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/

을 BTW, 안드로이드에 나는 또한 이미지를 회전하고 방향 EXIF ​​태그를 제거하는 경향이 : 여기

이미지 데이터를 복사 Sanselan을 사용하는 방법을 보여줍니다 블로그 게시물입니다. 예를 들어 Android 4.03이 설치된 Nexus S에서 카메라는 EXIF ​​메타 데이터에 방향 태그를 설정했지만 웹보기는 해당 정보를 무시하고 이미지를 잘못 표시했습니다. 슬프게도 실제 이미지 데이터를 회전시키고 EXIF ​​방향 태그를 제거하는 것은 모든 프로그램이 이미지를 올바르게 표시 할 수있는 유일한 방법입니다.게으른 사람을위한

+0

감사합니다. Theo, 나는이 대답에 감사 드리며 그것을 받아 들였습니다. 이 정보에 대한 링크가 있습니까? "Android OS 버전에 따라 ExifInterface가 EXIF ​​데이터를 손상시킬 수 있습니다." –

+0

그것은 내 경험에 기반을두고 있으며 ExifInterface가 버그가 있음을 처음으로 발견 한 사람은 아닙니다 [1]. 다음날에 내가 얼마나 많은 시간을 가졌는지에 따라, 몇 가지 예시와 사례를 종합하여 다시보고 할 수 있습니다. [1] http://mail-archives.apache.org/mod_mbox/commons-issues/201106.mbox/%[email protected]e.org%3E – Theo

+0

@Theo i ' 코드를 테스트했는데 일부 장치 및 이미지의 대부분/모든 특성을 복사하는 것으로 보입니다. 잘 복사되지 않는 속성의 예 : ISOSpeedRatings, FocalLength, FNumber. 어떻게 될 수 있는지 설명해 주시겠습니까? 나는 Android 4.4.2가 장착 된 넥서스 4 장치에서이를 테스트했으며 원본 파일과 새 파일에서 생성 된 ExifInterface를 비교했습니다. –

33

[자동 응답]

AFAICT가 대량으로 자동 또는이 무엇이든 스냅 샷 및 전송을 메타 데이터를 지속 할 메커니즘 이 없습니다.

대신 특정 속성을 명시 적으로 확인하고 ExifInterface를 사용하여 새 이미지 파일로 복사해야합니다.

http://developer.android.com/reference/android/media/ExifInterface.html

그래서 같은 :

ExifInterface oldExif = new ExifInterface(oldImagePath); 
String exifOrientation = oldExif.getAttribute(ExifInterface.TAG_ORIENTATION); 

if (exifOrientation != null) { 
    ExifInterface newExif = new ExifInterface(imagePath); 
    newExif.setAttribute(ExifInterface.TAG_ORIENTATION, exifOrientation); 
    newExif.saveAttributes(); 
} 
+0

이는 완벽했다. 감사! – Mauker

22

, 여기 재사용 가능한 기능입니다 :

public static void copyExif(String oldPath, String newPath) throws IOException 
{ 
    ExifInterface oldExif = new ExifInterface(oldPath); 

    String[] attributes = new String[] 
    { 
      ExifInterface.TAG_APERTURE, 
      ExifInterface.TAG_DATETIME, 
      ExifInterface.TAG_DATETIME_DIGITIZED, 
      ExifInterface.TAG_EXPOSURE_TIME, 
      ExifInterface.TAG_FLASH, 
      ExifInterface.TAG_FOCAL_LENGTH, 
      ExifInterface.TAG_GPS_ALTITUDE, 
      ExifInterface.TAG_GPS_ALTITUDE_REF, 
      ExifInterface.TAG_GPS_DATESTAMP, 
      ExifInterface.TAG_GPS_LATITUDE, 
      ExifInterface.TAG_GPS_LATITUDE_REF, 
      ExifInterface.TAG_GPS_LONGITUDE, 
      ExifInterface.TAG_GPS_LONGITUDE_REF, 
      ExifInterface.TAG_GPS_PROCESSING_METHOD, 
      ExifInterface.TAG_GPS_TIMESTAMP, 
      ExifInterface.TAG_IMAGE_LENGTH, 
      ExifInterface.TAG_IMAGE_WIDTH, 
      ExifInterface.TAG_ISO, 
      ExifInterface.TAG_MAKE, 
      ExifInterface.TAG_MODEL, 
      ExifInterface.TAG_ORIENTATION, 
      ExifInterface.TAG_SUBSEC_TIME, 
      ExifInterface.TAG_SUBSEC_TIME_DIG, 
      ExifInterface.TAG_SUBSEC_TIME_ORIG, 
      ExifInterface.TAG_WHITE_BALANCE 
    }; 

    ExifInterface newExif = new ExifInterface(newPath); 
    for (int i = 0; i < attributes.length; i++) 
    { 
     String value = oldExif.getAttribute(attributes[i]); 
     if (value != null) 
      newExif.setAttribute(attributes[i], value); 
    } 
    newExif.saveAttributes(); 
} 
+4

크기를 조정하는 경우 TAG_IMAGE_LENGTH 및 TAG_IMAGE_WIDTH을 (를) 업데이트하거나 복사하지 마세요. –