Tutorial: Bilder in JPG unter Android umwandeln
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:
- Format:
Bitmap.CompressFormat.JPEG - Qualität: Ein Wert von 0 bis 100 (100 = beste Qualität, größte Datei).
- 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)
}