Мне нужно было отправлять изображения по оченьнизкой пропускной способности соединение с телефона Android (до 10 кбайт/с) и хотел бы отправить их в прогрессивном (чересстрочном) режиме, чтобы пользователь на другом конце начал видеть изображение уже во время длительной передачи.Прямо сейчас я создаю изображение с помощью обычного приложения для работы с фотографиями:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Но это создает непрогрессивныефотографии, и я не смог найти, как убедить его поступить иначе. Насколько я мог определить, второй вариант, который я исследовал (чтение и повторное сжатие снятого изображения), был сорван, потому что метод сжатия растрового изображения не допускает никаких параметров кодирования, кроме имени формата и коэффициента сжатия:
bitmap.compress(Bitmap. CompressFormat.JPEG, 80, вне);
Я предпочел бы указать приложению для работы с фотографиями сохранять в прогрессивном режиме.
Следующим лучшим вариантом был бы алгоритм Java, который без потерь преобразует сохраненный jpeg в прогрессивный (jpegtran делает это в Linux, но это на C и полагается на libjepeg).
Следующим лучшим вариантом был бы способ указания соответствующих параметров кодирования для Android, позволяющий повторно сжимать его, или альтернативная библиотека Java, которая делает то же самое.
Дальнейшие исследования показали, что алгоритмы уже существуют ( /system/lib/libjpeg.so
) с исходниками в ~/android-sdk-linux/source-tree/external/jpeg
-- но, похоже, нет готовых оболочек JNI.