2016-11-21 40 views
9

Czy istnieje sposób zmiany rozmiaru pliku obrazu JPEG (z systemu plików na system plików) bez usuwania metadanych (podobnie jak ImageMagicksconvert in.jpg -resize 50% out.jpg)?Zmiana rozmiaru obrazu JPEG w systemie plików

Jedyny sposób, w jaki znalazłem zmianę rozmiaru plików .jpg Znalazłem: BitmapFactory.decodeStream i Bitmap.compress, co wygląda na dużo narzutów, jeśli ręcznie trzeba przesłać metadane obrazu.

+0

Przez zmianę rozmiaru, masz na myśli resampling obrazu, aby zmienić jego rozdzielczość? Jeśli tak, AFAIK, jedyne wbudowane rzeczy do tego są tym, co cytujesz w swoim pytaniu. – CommonsWare

+0

Tak, zmień rozdzielczość. Właśnie dodałem przykładowe polecenie, aby zilustrować to, czego szukam. –

+0

Jeśli nie ma czegoś, co czai się w pakiecie SDK dla tego, co przeoczyłem, twoje opcje będą polegały na użyciu biblioteki innej firmy lub [obsłudze nagłówków EXIF] (https://commonsware.com/blog/2016/05/31 /tale-two-exifinterfaces.html) w połączeniu z 'BitmapFactory' /' Bitmap'. – CommonsWare

Odpowiedz

2

może być możliwe do odczytania metadanych z android.media.ExifInterface, kompresji obrazu poprzez Bitmap.compress a następnie zapisać metadane powrotem:

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

nie testowałem, ale patrząc na source code of ExifInterface może pracować . Jeśli nie chcesz polegać na szczegółach implementacji, możesz oczywiście przeglądać wszystkie atrybuty i kopiować je.


Innym rozwiązaniem byłoby użycie biblioteki Android Exif Extended. Jest to mały projekt do odczytu i zapisu danych exif.

+0

Pytanie brzmi, co oznacza "oryginalny plik obrazu" z metody saveAttributes(). Może to być i otworzyć uchwyt pliku lub coś takiego. Sądzę, że sposobem na prawidłowe użycie tego jest posiadanie dwóch instancji ExifInterface i kopiowanie wszystkiego od jednego do drugiego. –

+0

@SimonWarta Jeśli spojrzeć na [kod źródłowy] (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), nie ma otwartego uchwytu pliku (o ile wiem). Wywołuje natywną metodę z nazwą pliku i atrybutami jako parametrami. – Manu

+0

To może działać w przypadku jednej wersji Androida. Problem polega na tym, że nadużywasz szczegółów konkretnej implementacji. Funkcja saveAttributes została udokumentowana w celu zapisania zmienionych atrybutów oryginalnego pliku, bez zapisywania nowych w nowym pliku. Pewnego dnia implementacja może zapisywać tylko zmiany na dysku, nie wszystkie atrybuty. Wyszukaj np. do dwóch nowych konstruktorów API24. Wymuszą one inną implementację. W każdym razie, możesz dostosować odpowiedź do wersji pętli i kopii z dwoma obiektami ExifInterface. –