2016-11-21 2 views
9

Есть ли способ изменить размер файла изображения JPEG (от файловой системы до файловой системы) без удаления метаданных (как ImageMagicksconvert in.jpg -resize 50% out.jpg)?Изменение размера изображения JPEG в файловой системе

Единственный способ, который я нашел для изменения размера .jpg файлов, которые я нашел, - BitmapFactory.decodeStream и Bitmap.compress, который выглядит как много накладных расходов, если мне нужно вручную передавать метаданные изображения.

+0

По размеру, вы имеете в виду передискретирование изображения, чтобы изменить его разрешение? Если это так, AFAIK, единственный встроенный материал для этого - это то, что вы цитируете в своем вопросе. – CommonsWare

+0

Да, измените разрешение. Я просто добавил примерную команду, чтобы проиллюстрировать, что я ищу. –

+0

Если в SDK есть что-то скрытое, что я пропустил, ваши варианты будут состоять в использовании сторонней библиотеки или [обрабатывать заголовки EXIF ​​самостоятельно] (https://commonsware.com/blog/2016/05/31 /tale-two-exifinterfaces.html) в сочетании с 'BitmapFactory' /' Bitmap'. – CommonsWare

ответ

2

Может быть, можно прочитать метаданные с android.media.ExifInterface, сжатие изображения с помощью Bitmap.compress, а затем сохранить метаданные обратно:

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

Я не проверял, но, глядя на source code of ExifInterface, он может работать , Если вы не хотите полагаться на детали реализации, вы можете, конечно, пропустить все атрибуты и скопировать их.


Другим решением было бы использовать библиотеку Android Exif Extended. Это небольшой проект для чтения и записи данных exif.

+0

Вопрос в том, что означает «исходный файл изображения» из saveAttributes(). Это может быть и открыть дескриптор файла или что-то в этом роде. Я предполагаю, что правильно использовать это, это иметь два экземпляра ExifInterface и копировать все из одного в другое. –

+0

@SimonWarta Если вы посмотрите на [исходный код] (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), у него нет дескриптора открытого файла (насколько я могу судить). Он вызывает собственный метод с именем файла и атрибутами в качестве параметров. – Manu

+0

Это может работать для одной версии Android. Проблема в том, что вы злоупотребляете деталями конкретной реализации. saveAttributes задокументирован, чтобы сохранить измененные атрибуты исходного файла, а не сохранять новые в новый файл. В один прекрасный день реализация может записывать изменения только на диск, а не на все атрибуты. Посмотрите, например. в два новых конструктора API24. Они будут применять другую реализацию. В любом случае вы можете адаптировать ответ в виде цикла и копии с двумя объектами ExifInterface. –

Смежные вопросы