Tutorial: Bilder in JPG unter Android umwandeln

Melden

Hier ist ein ausführliches Tutorial, wie du Bilder in einer Android-App (mit Kotlin) in das JPG-Format konvertierst.


In der Android-Entwicklung ist es eine häufige Aufgabe, Bilder (z. B. von der Kamera oder aus der Galerie), die oft in Formaten wie PNG oder WebP vorliegen, in das platzsparende JPG-Format zu konvertieren. In diesem Tutorial nutzen wir die native Bitmap-Klasse von Android, um dies effizient umzusetzen.

1. Voraussetzungen

  • Grundkenntnisse in Kotlin und der Android-Entwicklung.
  • Ein Android-Projekt in Android Studio.
  • Ein Bild als Bitmap-Objekt (dieses kann aus einem URI, einem Resource-Ordner oder der Kamera stammen).

2. Das Kernkonzept: Die compress-Methode

Die Konvertierung in Android erfolgt fast immer über die Methode Bitmap.compress(). Diese Methode nimmt drei Parameter entgegen:

  1. Format: Bitmap.CompressFormat.JPEG
  2. Qualität: Ein Wert von 0 bis 100 (100 = beste Qualität, größte Datei).
  3. OutputStream: Wohin die Daten geschrieben werden sollen.

3. Schritt-für-Schritt-Anleitung

Schritt 1: Eine Bitmap laden

Bevor wir konvertieren können, benötigen wir ein Bitmap-Objekt. Falls du ein Bild aus einem Pfad lädst:

val bitmap = BitmapFactory.decodeFile(imagePath)

Schritt 2: Die Konvertierungs-Funktion erstellen

Hier ist eine fertige Funktion, die eine Bitmap nimmt und sie als JPG-Datei speichert:

import android.graphics.Bitmap
import java.io.File
import java.io.FileOutputStream
import java.io.IOException

fun convertBitmapToJpg(bitmap: Bitmap, outputFile: File, quality: Int = 90): Boolean {
    var out: FileOutputStream? = null
    return try {
        out = FileOutputStream(outputFile)
        // Hier passiert die eigentliche Konvertierung
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, out)
        true // Erfolg
    } catch (e: IOException) {
        e.printStackTrace()
        false // Fehler aufgetreten
    } finally {
        try {
            out?.close()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

Schritt 3: Die Funktion anwenden

Du musst nun definieren, wo das JPG gespeichert werden soll. Meistens ist dies der Cache-Ordner oder das Verzeichnis für externe Medien.

// Zielpfad festlegen (Beispiel: im Cache der App)
val storageDir = context.cacheDir
val jpgFile = File(storageDir, "mein_bild_${System.currentTimeMillis()}.jpg")

// Konvertierung starten
val success = convertBitmapToJpg(myBitmap, jpgFile, 85)

if (success) {
    println("Bild erfolgreich gespeichert unter: ${jpgFile.absolutePath}")
} else {
    println("Konvertierung fehlgeschlagen.")
}

4. Wichtige Besonderheiten

Speicherberechtigungen (Scoped Storage)

Ab Android 10 (API 29) solltest du zum Speichern von Bildern in der öffentlichen Galerie den MediaStore verwenden, anstatt direkt auf Dateipfade zuzugreifen. Wenn du die Bilder nur innerhalb deiner App nutzt, ist der context.getExternalFilesDir() oder context.cacheDir ohne zusätzliche Berechtigungen nutzbar.

Speicherplatz freigeben

Bitmaps verbrauchen viel RAM. Wenn du die Bitmap nach der Konvertierung nicht mehr benötigst, solltest du sie freigeben:

bitmap.recycle()

Qualität vs. Dateigröße

  • Qualität 100: Kaum Kompressionsverluste, aber die Datei bleibt groß.
  • Qualität 80-90: Der "Sweet Spot" für die meisten Apps (kaum sichtbarer Unterschied, deutlich kleinere Datei).
  • Qualität < 50: Deutliche Artefakte sichtbar.

5. Zusammenfassung

Die Umwandlung in JPG ist in Android dank der Bitmap.compress-Funktion sehr einfach. Der wichtigste Teil ist das Handling der Streams und die Wahl des richtigen Speicherorts. Für moderne Apps empfiehlt es sich, diese Operation in einem Hintergrund-Thread (z.B. mit Coroutines) auszuführen, damit die Benutzeroberfläche (UI) während der Konvertierung nicht einfriert.

// Beispiel mit Coroutines
lifecycleScope.launch(Dispatchers.IO) {
    convertBitmapToJpg(myBitmap, jpgFile, 90)
}
0