2011-01-04 4 views
5

내가 지금처럼 개인 디렉토리에 이미지를 복사하고 :는 Exif 데이터 손실

FileChannel source = null; 
FileChannel destination = null; 
source = new FileInputStream(sourceFile).getChannel(); 
destination = new FileOutputStream(destFile).getChannel(); 
destination.transferFrom(source, 0, source.size()); 
source.close(); 
destination.close(); 

을 ..하지만 난 갤러리에 다시 삽입 할 때의 손길이 닿지 않은, 나중에 :

private void moveImageToGallery(Uri inUri) throws Exception { 
    MediaStore.Images.Media.insertImage(getContentResolver(), ImageUtil.loadFullBitmap(inUri.getPath()), null, null); 
} 

.. 분명히 Exif 데이터가 손실됩니다. 회전이 더 이상 작동하지 않습니다. 이미지 파일을 복사하고 데이터를 잃어 버리지 않는 방법이 있습니까? 어떤 제안을 주셔서 감사합니다.

+0

구글 안드로이드 그룹을 통해 Purusing를, "유효한 기능 요청 것 같다". –

+1

그 일을하는 좋은 방법이 없다는 것은 어렵습니다. 할 수있는 일은 파일을 복사 한 후 삽입하기 전에 ExifInterface를 사용하여 이미지 데이터베이스에서 읽을 수있는 회전, 위도/경도 및 찍은 날짜와 같은 속성을 추가하는 것입니다. 그런 다음 이미지를 삽입하면 해당 이미지를 올바르게 읽고 새 데이터베이스 항목에 추가해야합니다. 와우,이게 2 살인 걸 깨달았 어! 나는 당신이 이미 이런 일을했을 것이라고 확신하지만, 여기에 내 대답을 남겨 둘 것입니다. 왜 이것이 Android 질문 목록 상단에 있는지 잘 모릅니다. –

답변

2

여기 FileChannel은 실제로 데이터를 읽은 다음 해독하고 다시 인코딩 한 다음 쓰는 것 같습니다. 따라서 EXIF ​​데이터가 손실됩니다. 파일을 (바이트 단위로) 복사해도 내용은 변경되지 않습니다. 복사 전/후에 일어날 수있는 유일한 일은 파일 액세스 변경입니다 (기억하십시오 : Android는 Linux를 기반으로합니다. Linux는 UNIX => rwx 권한 (chmod 참조)입니다. 결국 파일의 읽기 또는 쓰기가 거부됩니다. 따라서 FileChannel이 원치 않는 작업을하는 것은 명백합니다.

이 코드는 작동 할 것입니다 : 하나 dev에 말했다, 이것이 OS에 문제가 있는게 틀림 없어

InputStream in = new FileInputStream(source); 
OutputStream out = new FileOutputStream(dest); 
byte[] buf = new byte[1024]; int len; 
while ((len = in.read(buf)) > 0) 
    out.write(buf, 0, len); 
in.close(); 
out.close(); 
+0

나는 그것을 시도 할 것이다. 나는 갤러리에서 사진을 조작 할 때 안드로이드의 "채널"을 거쳐야한다고 생각했지만 그렇지 않은 것처럼 보입니다. 그냥 무료입니다. –