524 Stimmen

Bitmap an einem Ort speichern

Ich arbeite an einer Funktion, die ein Bild von einem Webserver herunterlädt, es auf dem Bildschirm anzeigt und, wenn der Benutzer das Bild behalten möchte, es auf der SD-Karte in einem bestimmten Ordner speichert. Gibt es eine einfache Möglichkeit, ein Bitmap zu nehmen und es einfach auf der SD-Karte in einem Ordner meiner Wahl zu speichern?

Mein Problem ist, dass ich das Bild herunterladen kann, zeigen Sie es auf dem Bildschirm als Bitmap. Die einzige Möglichkeit, die ich gefunden habe, um ein Bild in einem bestimmten Ordner zu speichern, ist die Verwendung von FileOutputStream, aber das erfordert ein Byte-Array. Ich bin nicht sicher, wie zu konvertieren (wenn dies sogar der richtige Weg ist) von Bitmap zu Byte-Array, so dass ich eine FileOutputStream verwenden können, um die Daten zu schreiben.

Die andere Möglichkeit, die ich habe, ist die Verwendung von MediaStore :

MediaStore.Images.Media.insertImage(getContentResolver(), bm,
    barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");

Das Speichern auf der SD-Karte funktioniert gut, aber Sie können den Ordner nicht anpassen.

987voto

Ulrich Scheller Punkte 12630
try (FileOutputStream out = new FileOutputStream(filename)) {
    bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
    // PNG is a lossless format, the compression factor (100) is ignored
} catch (IOException e) {
    e.printStackTrace();
}

147voto

JoaquinG Punkte 2030

Sie sollten die Bitmap.compress() Methode, um ein Bitmap als Datei zu speichern. Sie komprimiert (wenn das verwendete Format es zulässt) Ihr Bild und schiebt es in einen OutputStream.

Hier ist ein Beispiel für eine Bitmap-Instanz, die durch getImageBitmap(myurl) das als JPEG mit einer Komprimierungsrate von 85% komprimiert werden kann:

// Assume block needs to be inside a Try/Catch block.
String path = Environment.getExternalStorageDirectory().toString();
OutputStream fOut = null;
Integer counter = 0;
File file = new File(path, "FitnessGirl"+counter+".jpg"); // the File to save , append increasing numeric counter to prevent files from getting overwritten.
fOut = new FileOutputStream(file);

Bitmap pictureBitmap = getImageBitmap(myurl); // obtaining the Bitmap
pictureBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // saving the Bitmap to a file compressed as a JPEG with 85% compression rate
fOut.flush(); // Not really required
fOut.close(); // do not forget to close the stream

MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());

39voto

user996042 Punkte 549
outStream = new FileOutputStream(file);

wird ohne Erlaubnis in AndroidManifest.xml eine Ausnahme auslösen (zumindest in os2.2):

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

31voto

Alessandro Punkte 281

Innerhalb onActivityResult :

String filename = "pippo.png";
File sd = Environment.getExternalStorageDirectory();
File dest = new File(sd, filename);

Bitmap bitmap = (Bitmap)data.getExtras().get("data");
try {
     FileOutputStream out = new FileOutputStream(dest);
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
     out.flush();
     out.close();
} catch (Exception e) {
     e.printStackTrace();
}

14voto

Vahe Gharibyan Punkte 4107

Ich weiß, dass diese Frage schon alt ist, aber jetzt können wir das gleiche Ergebnis erreichen, ohne WRITE_EXTERNAL_STORAGE Erlaubnis. Stattdessen können wir File provider verwenden.

private fun storeBitmap(bitmap: Bitmap, file: File){
        requireContext().getUriForFile(file)?.run {
            requireContext().contentResolver.openOutputStream(this)?.run {
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, this)
                close()
            }
        }
    }

Wie kann ich eine Datei vom Provider abrufen?

fun Context.getUriForFile(file: File): Uri? {
        return FileProvider.getUriForFile(
            this,
            "$packageName.fileprovider",
            file
        )
    }

Vergessen Sie auch nicht, Ihre provider unter Android manifest

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"/>
    </provider>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X