2011-01-04 19 views
5

ben şöyle özel bir dizine bir görüntü kopyalama ediyorum:, Exif verileri kaybeder

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(); 

..ama ben Galerisi'nin yanında geri sokun zaman el değmemiş, daha sonraki bir zamanda:

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

..it görünüşte onun Exif verilerini kaybeder. Rotasyon artık çalışmıyor. Bir görüntü dosyasını kopyalayıp veriyi kaybetmemin bir yolu var mı? Önerileriniz için teşekkürler.

+0

Google Android grubu aracılığıyla purusing, "geçerli bir özellik isteği gibi görünüyor". –

+1

Bunu yapmak için iyi bir yol olmadığını söylemek zor. Ne yapabilirsiniz dosyayı kopyaladıktan sonra, ve bunu takmadan önce, enlem/boylam, bu tür rotasyon gibi resim veritabanından okuyabilir özelliklerini eklemek için ExifInterface kullanın ve tarih alınan. Ardından, görüntüyü eklediğinizde, bunları doğru bir şekilde okumalı ve bunları yeni veritabanı girişine eklemelidir. Vay, sadece 2 yaşında olduğunu anladım! Eminim böyle bir şey yapmışsındır, ama cevabımı burada bırakacağım. Bunun neden Android soru listesinin başında olduğunu bilmiyor. –

cevap

2

FileChannel, burada, aslında o zaman yazma, reencode, bunu deşifre, veri okumak gibi görünüyor; böylece EXIF ​​verilerini kaybedersiniz. Bir dosyayı (byte-byte) kopyalama, içeriğini değiştirmez. Kopya dosya erişim değişimdir önce sonra gerçekleşebilir tek şey/(hatırlayın: Android bir UNIX => rwx izinleri olmak Linux, Linux dayanmaktadır (bkz chmod)), en sonunda dosya okuma veya yazma inkar. Bu yüzden FileChannel'in istenmeyen bir şey yaptığı açıktır.

Bu kod işleri yapacaktır: Bir dev belirterek, bu bir OS konudur beni inandıramaz

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

Bunu deneyeceğim. Fotoğrafların galeriden manipüle edildiğinde Android'in "kanalını" kullanmanız gerektiğini düşünmüştüm ama durum böyle değil, sadece herkes için ücretsiz. –

İlgili konular