2011-01-26 4 views
17

Android에서는 휴대 전화의 사진에서 비트 맵을 해독하면 원본의 EXIF ​​데이터가 손실됩니다. 이 비트 맵을 소켓을 통해 내 서버로 보내고 누락 된 EXIF ​​데이터를 보내려는 데이터에 다시 연결하려고합니다.안드로이드에서 직렬화 된 비트 맵에 EXIF ​​메타 데이터를 첨부하는 방법은 무엇입니까?

Bitmap bitmap = ... 
ByteArrayOutputStream stream = new ByteArrayOutputStream(bitmap); 
bitmap.compress(CompressFormat.JPEG, 70, stream); 
byte[] input = stream.toByteArray(); 

내가 EXIF에서 얻을 수있는 ExifInterface를 사용하려면 :

나는 미디어 스토어 MediaStore에서 비트 맵 객체를로드하고 소켓을 통해 그것을 보낼 준비 바이트 배열로 압축 일부 코드가 메타 데이터를 SD 카드의 원본 jpeg에 저장하고 어떻게 든 서버 바이트 (서버에서이 작업을 수행하지 않고)에 올바른 EXIF가있는 jpeg을 추출 할 수있는 방식으로 나가는 바이트 배열에 추가합니다. 더 라이브러리를 사용하지 않는 해결책을 찾기 위해 최적, 내가 좋아하는 것 :

String path = ... //bitmap file path 
ExifInterface exif = new ExifInterface(path); 
... = exif.getAttribute(...) 

편집 : 지금까지, 나는 모든 EXIF ​​데이터를 읽을 ExifInterface을 사용할 수 있었다. EXIF가 포함 된 원래 jpeg의 바이트 배열 인덱스를 얻고이 바이트를 bitmap.compress(...)에 의해 생성 된 바이트 배열에 추가하면됩니다.

+0

당신이 바이트 배열에 EXIF ​​정보를 추가로 성공 했습니까? – Vikas

답변

7

@Nick CampionSanselan에게 감사드립니다.

근무 코드 :

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.JPEG, 100, bos); //Bitmap object is your image 
byte[] data = bos.toByteArray(); 

TiffOutputSet outputSet = null; 

IImageMetadata metadata = Sanselan.getMetadata(new File(filepath)); // filepath is the path to your image file stored in SD card (which contains exif info) 
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata; 
if (null != jpegMetadata) 
{ 
    TiffImageMetadata exif = jpegMetadata.getExif(); 
    if (null != exif) 
    { 
     outputSet = exif.getOutputSet(); 
    } 
} 
if (null != outputSet) 
{ 
    bos.flush(); 
    bos.close(); 
    bos = new ByteArrayOutputStream(); 
    ExifRewriter ER = new ExifRewriter(); 
    ER.updateExifMetadataLossless(data, bos, outputSet); 
    data = bos.toByteArray(); //Update you Byte array, Now it contains exif information! 
} 
+0

위의 코드는 Sanselan Android에서 예상대로 작동하지 않습니다. 특히, 이미지의 크기를 조정하면 위의 코드는 EXIF ​​메타 데이터를 복사하는 것이 아니라 이미지 데이터를 덮어 쓰고 크기 조정을 취소합니다. 다른 사람들이 만난 Sanselan 문제인 것처럼 보입니다. http://mail-archives.apache.org/mod_mbox/commons-user/201103.mbox/%[email protected]%3E. 여기에이 문제에 대한 해결 방법에 대해 쓴 : http://bricolsoftconsulting.com/2012/12/08/copying-exif-metadata-using-sanselan/ – Theo

+0

그것은 나와 함께 잘 작동합니다. 'Sanselan'은 https://commons.apache.org/proper/commons-imaging/을 가리켜 야하고'Sanselan.getMetadata'는'Imaging.getMetadata'가됩니다. – Leon

관련 문제