Apps für Android programmieren leicht gemacht!
JPEG komprimieren - Android

JPEG komprimieren

Ich bastel momentan an einer kleinen App für mich und meine Freundin, in der ich gerne mehrere kleinere Bilder als Hintergrundbild einstellen möchte. Das Ganze soll natürlich so dynamisch wie nur irgend möglich sein und aus diesem Grund soll uns beiden die Möglichkeit geboten sein die Bilder innerhalb der App hoch zu laden. Die Bilder werden dann auf meiner NAS gespeichert und beim nächsten Aufruf von eben dieser heruntergeladen und innerhalb der App gespeichert.
So ist es dann im Endeffekt möglich, dass ich ein Bild als Hintergrund hochlade und meine Freundin dieses dann über die NAS wieder herunterlädt und in der App speichert. Beim zweiten „herunterladen“ wird das Bild dann wiederum aus dem Speicher der App verwendet und somit nicht nochmal heruntergeladen.

Erst einmal eine super Idee, aber dann kamen die Probleme.
Was passiert, wenn ich ein Bild hoch lade, dass eine Größe von mehreren MB hat? – Es braucht länger zum herunterladen. Erst einmal nicht das Problem.
Was passiert aber, wenn es nicht ein Bild von mehreren MB ist, sondern 10, 20 oder 100? – Die App wird träge, das Datenvolumen wird unnötig belastet und im schlimmsten Fall hängt sich die App auf, da der RAM voll läuft.

Hier gibt es jetzt zwei Lösungsansätze:

  1. Ich verkleinere die Maße der Bilder.
  2. Ich verkleinere die Dateigröße der Bilder.

Ersteres kam in diesem Falle nicht in Frage, da die Hintergrundbilder auch gezoomt werden sollten. Also habe ich mich daran gemacht, die Bildqualität zu verringern, um damit JPEG komprimieren zu können. Im Gegensatz zu PNG Dateien, ist eine Kompression von JPEG Bildern immer mit einem Qualitätsverlust verknüpft.

Komprimieren könnt ihr ein JPEG Bild, indem ihr folgenden Code ausführt:

if(dateiPfadZumBild != null) {
    String neuerDateiPfadZumBild = dateiPfadZumBild.replace(".jpg", ".min.jpg");
    Bitmap bmp = BitmapFactory.decodeFile(dateiPfadZumBild);

    FileOutputStream out = null;
    try {
        out = new FileOutputStream(new File(neuerDateiPfadZumBild), true);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    bmp.compress(Bitmap.CompressFormat.JPEG, 70, out);
}

Hier wird eine Qualitätsreduktion auf 70% der originalen Qualität vorgenommen.

Erklärung:

Wir müssen hier lediglich einen vollen Dateipfad in dem String „dateiPfadZumBild“ angeben. Anschließend wird aus diesem Dateipfad ein „neuer“ Dateipfad erstellt, welcher nicht mehr die Endung „.jpg“, sondern „.min.jpg“ besitzt. Damit wird dann das Bild in den nachfolgenden Zeilen eingelesen, komprimiert und im selben Ordner unter dem neuen Namen „xxxx.min.jpg“ gespeichert.

 

Ergebnis:

Unkomprimiert
Komprimiert
3,40 MB
1,03 MB

 

Verwendet habe ich das folgende Bild aus meiner letzten Reise nach Paris.

Unkomprimiertes Bild
Unkomprimiertes Bild
Von Android komprimiertes Bild
Von Android komprimiertes Bild

Schlusswort:

Wer unter Android auf die Bilder des Gerätes zugreifen will, der muss zwangsläufig eine Berechtigung erfragen. Das geht über diese beiden Einträge in der AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Wie ihr dann schlussendlich auch die Berechtigung unter Android 6+ einholt erfahrt ihr in diesem Artikel: Android 6 – Berechtigung einholen

Das Komprimieren von JPEG Dateien ist in diesem Falle auf jeden Fall mit einem Qualitätsverlust verknüpft. Wer die Qualität nach der Komprimierung so hoch wie möglich halten will, der sollte die 70 im oberen Code etwa auf 80 erhöhen oder eine andere höhere Zahl wählen. Zu beachten ist auch, dass es unter Umständen einmal sein kann, dass das Komprimierte Bild größer ist, als das Original (vor allem bei kleinen Bildern). Deshalb empfehle ich immer erst eine „.min.jpg“ Datei zu erstellen, die Dateigrößen zu vergleichen und erst danach das originale Bild mit dem komprimierten zu überschreiben.

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld