2012-06-11 7 views
7

Ich muss Bilder über eine sehr Verbindung mit niedriger Bandbreite von einem Android-Handy (bis zu 10kByte/s) senden und möchte sie im progressiven (interlaced) Modus so senden dass der Benutzer am anderen Ende beginnt, das Bild bereits während der langen Übertragung zu sehen. Gerade jetzt, ich schaff' das Bild mit dem regelmäßigen Foto-App:So erstellen Sie ein progressives JPEG-Bild auf Android

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

Aber das schafft nicht-progressive Fotos und ich habe nicht in der Lage gewesen, um herauszufinden, wie es zu überzeugen, es anders zu machen. Die zweite Option, die ich untersucht (Lesen und Wieder Komprimierung des aufgenommenen Bildes) wurde vereitelt, weil die Kompresse Methode des Bitmap keine Codierung Parameter außer Formatnamen und Kompressionsfaktor erlauben, soweit ich feststellen konnte:

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

Meine bevorzugte Lösung wäre, die Foto-App anzuweisen, im progressiven Modus zu speichern.

Die nächste beste Option wäre ein Java-Algorithmus, der das gespeicherte JPEG verlustfrei in progressive konvertiert (jpegtran tut dies unter Linux, aber es ist in C und beruht auf libjepeg).

Die nächste beste wäre eine Methode, um die relevanten Encoding-Parameter für Android zu bestimmen, so dass ich sie erneut komprimieren kann, oder eine alternative Java-Bibliothek, die das Gleiche tut.

Weitere Forschung ergab, dass die Algorithmen bereits vorhanden sind (/system/lib/libjpeg.so) mit den Quellen in ~/android-sdk-linux/source-tree/external/jpeg - aber es scheint nicht zu JNI Wrapper leicht verfügbar sein.

+1

Nur eine Anmerkung: "progressive" ist genau das, was Sie bekommen: von oben nach unten. Was du suchst, heißt "interlaced". Das JPEG-Ausgabeformat unterstützt kein Interlacing. PNG tut, also müssen Sie das Erstellen von verschachteltem PNG-Bild betrachten. –

+1

@AleksG Sorry, aber ich muss widersprechen. Bitte lesen Sie [wikipedia] (https://en.wikipedia.org/wiki/JPEG) Abschnitt 'JPEG-Komprimierung'. Wie ich in der Frage erwähnt habe, ist dieses Format unter Linux mit jpegtran einfach zu erstellen. – Ivin

Antwort

1

Kennen Sie dieses Dokument?

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

Es scheint Schreib progressive Unterstützung zu haben.

Alternativ könnten Sie z.B. OpenJPEG über JNI. Siehe http://www.linux-mag.com/id/7697/ als Anfang.

+0

Vielen Dank für den Vorschlag, aber ich brauche die Lösung in Android, und JPEGImageWriteParam ist dort nicht verfügbar. Mit dem libjpeg (Openjpeg) konnte ich direkt nicht arbeiten. – Ivin

+0

Ich habe es. Aber die JDK-Quelle ist verfügbar, und vielleicht könnten Sie diese/diese Quellklassen wiederverwenden? – TFuto

+0

Sie sind verfügbar und ich habe es versucht - aber wenn Sie versuchen, diese Funktionalität über zu ziehen, ziehen Sie mehrere Dutzend Klassen zusammen mit Ti. Die meisten Pakete in diesem Bereich werden von Android nicht unterstützt. – Ivin

Verwandte Themen