2012-06-11 10 views
7

Necesito enviar imágenes a través de muy conexión de bajo ancho de banda desde un teléfono Android (hasta 10kByte/s) y me gustaría enviarlos en modo progresivo (entrelazado) para que el usuario en el otro extremo empiece a ver la imagen durante la larga transferencia. En este momento, estoy creando la imagen con la aplicación de fotos regulares:Cómo crear una imagen JPEG progresiva en Android

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

pero esto crea no progresivas fotos y no he podido descubrir cómo convencer a hacer otra cosa. La segunda opción exploré (lectura y volver a comprimir la imagen tomada) quedó frustrado porque el método de compresión del mapa de bits no permite ningún parámetro de codificación, además de nombre de formato y el factor de compresión por lo que yo pude determinar:

bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);

Mi solución preferida sería instruir a la aplicación de fotos para que guarde en modo progresivo.

La siguiente mejor opción sería un algoritmo de Java que convierta sin pérdidas el jpeg almacenado a progresivo (jpegtran lo hace en Linux, pero está en C y se basa en libjepeg).

El siguiente mejor sería un método para especificar los parámetros de codificación relevantes para Android, lo que me permite volver a comprimirlo, o una biblioteca alternativa de Java que haga lo mismo.

La investigación adicional reveló que los algoritmos ya están allí (/system/lib/libjpeg.so) con las fuentes en ~/android-sdk-linux/source-tree/external/jpeg, pero parece que no hay envoltorios JNI disponibles.

+1

Solo una nota: "progresivo" es exactamente lo que obtienes: de arriba a abajo. Lo que estás buscando se llama "entrelazado". El formato de salida JPEG no admite el entrelazado. PNG lo hace, por lo que debe considerar crear una imagen PNG entrelazada. –

+1

@AleksG Lo siento, pero tengo que estar en desacuerdo. Consulte la sección [wikipedia] (https://en.wikipedia.org/wiki/JPEG) 'Compresión JPEG'. Como mencioné en la pregunta, este formato es fácil de crear en 'Linux' usando jpegtran. – Ivin

Respuesta

1

¿Has visto este documento?

http://docs.oracle.com/javase/6/docs/api/javax/imageio/plugins/jpeg/JPEGImageWriteParam.html

Parece tener el apoyo progresivo de escritura.

Alternativamente, podría usar p. Ej. OpenJPEG a través de JNI. Ver http://www.linux-mag.com/id/7697/ como un comienzo.

+0

Gracias por la sugerencia, pero necesito la solución en Android, y JPEGImageWriteParam no está disponible allí. Usando el libjpeg (Openjpeg) directamente, simplemente no tuve la oportunidad de trabajar. – Ivin

+0

Lo tengo. Pero la fuente JDK está disponible, y tal vez podrías reutilizar esa/esas clases fuente? – TFuto

+0

Están disponibles y lo he intentado, pero si tratas de aprovechar esa funcionalidad, estás tomando varias docenas de clases junto con ti. La mayoría de los paquetes en esta área no son compatibles con Android. – Ivin

Cuestiones relacionadas