2016-11-21 30 views
9

Bir meta görüntü dosyasını (dosya sisteminden dosya sistemine) meta verilerini kaldırmadan (ImageMagicksconvert in.jpg -resize 50% out.jpg gibi) yeniden boyutlandırmanın bir yolu var mı?Dosya sistemindeki JPEG resmini yeniden boyutlandırma

buldum ben .jpg dosyalarını yeniden boyutlandırmak için bulunan tek yolu elle görüntü meta veri aktarmak gerekirse yükü çok göründüğünün hangi BitmapFactory.decodeStream ve Bitmap.compress olduğunu.

+0

, onun çözünürlüğünü değiştirmek için görüntüyü yeniden örnekleyerek demek? Eğer öyleyse, AFAIK, bunun için tek yerleşik şey, sorunuzda alıntı yaptığınız şeydir. – CommonsWare

+0

Evet, çözünürlüğü değiştir. Ne aradığımı göstermek için örnek bir komut ekledim. Kaçırdığım ki bunun için SDK gizlenen şey yoksa –

+0

, seçenekleriniz bir üçüncü taraf kitaplığı kullanın veya (https://commonsware.com/blog/2016/05/31 [EXIF başlıklarını kendiniz idare] olacaktır /tale-two-exifinterfaces.html) 'BitmapFactory'/'Bitmap' ile birlikte. – CommonsWare

cevap

2

android.media.ExifInterface ile meta okumak Bitmap.compress aracılığıyla görüntüyü sıkıştırmak ve sonra geri meta kaydetmek mümkün olabilir:

String filename = "yourfile.jpg"; 
// this reads all meta data 
ExifInterface exif = new ExifInterface(filename); 

// read and compress file 
Bitmap bitmap = BitmapFactory.decodeFile(filename); 
FileOutputStream fos = new FileOutputStream(filename); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); 
fos.close(); 

// write meta data back 
exif.saveAttributes(); 

ben bunu test, ama source code of ExifInterface bakarak vermedi, bu işe yarayabilir . Uygulama ayrıntılarına güvenmek istemiyorsanız, elbette tüm öznitelikler arasında geçiş yapabilir ve bunları kopyalayabilirsiniz.


Başka bir çözüm Android Exif Extended kütüphanesini kullanmak olacaktır. Exif verileri okumak ve yazmak için küçük bir projedir. boyutlandırma By

+0

Soru, saveAttributes() öğesinin "orijinal resim dosyası" anlamına gelir. Bu açık dosya tanıtıcısı veya bir şey olabilir. Sanırım bunu düzgün kullanmanın yolu, iki ExifInterface örneğine sahip olmak ve her şeyi birinden diğerine kopyalamaktır. –

+0

@SimonWarta [Kaynak kodu] 'na bakarsanız (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/media/ExifInterface .java # ExifInterface.saveAttributes% 28% 29), açık bir dosya tanıtıcısına sahip değil (açıklayabildiğim kadarıyla). Dosya adı ve öznitelikleri parametreler olarak yerel bir yöntem çağırır. – Manu

+0

Bu, bir Android sürümü için işe yarayabilir. Sorun, belirli uygulamanın detaylarını kötüye kullandığınızdır. saveAttributes, orijinal dosyanın değiştirilen niteliklerini kaydetmek için yenilerini yeni bir dosyaya kaydetmeyecek şekilde belgelenmiştir. Bir gün, uygulama sadece tüm değişiklikleri değil, diske değişiklikler yazabilir. Ör. iki yeni API24 kurucuya. Bunlar farklı bir uygulamayı zorlayacak. Neyse, cevabı iki ExifInterface nesnesiyle döngü ve kopya sürümüne uyarlayabilirsiniz. –