Speichern Sie die Bitmap am Speicherort


469

Ich arbeite an einer Funktion zum Herunterladen eines Bildes von einem Webserver, zum Anzeigen auf dem Bildschirm. Wenn der Benutzer das Bild behalten möchte, speichern Sie es auf der SD-Karte in einem bestimmten Ordner. Gibt es eine einfache Möglichkeit, eine Bitmap zu erstellen und sie einfach auf der SD-Karte in einem Ordner meiner Wahl zu speichern?

Mein Problem ist, dass ich das Bild herunterladen und als Bitmap auf dem Bildschirm anzeigen kann. Die einzige Möglichkeit, ein Bild in einem bestimmten Ordner zu speichern, ist die Verwendung von FileOutputStream. Dafür ist jedoch ein Byte-Array erforderlich. Ich bin nicht sicher, wie ich von Bitmap in ein Byte-Array konvertieren soll (wenn dies überhaupt der richtige Weg ist), daher kann ich die Daten mit einem FileOutputStream schreiben.

Die andere Option, die ich habe, ist die Verwendung von MediaStore:

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

Das funktioniert gut, um auf einer SD-Karte zu speichern, aber Sie können den Ordner nicht anpassen.


Genau das, was ich in meiner App mache. Ich lade einen großen Bildformular-Webserver herunter, bearbeite ihn und lade die Bitmap direkt in eine Bildansicht über mImage.setImageBitmap(_result.getBitmap());in meinem onTaskComplete()Rückruf. Ich muss jetzt Benutzern erlauben, die Datei lokal zu speichern, wenn sie über ein Kontextmenü mit langem Drücken möchten. Ich sollte in der Lage sein, die folgende Lösung zu verwenden. Was ich aber wissen möchte, haben Sie einen besseren Ansatz dafür gefunden?
Wired00

Hier gibt es eine elegante Möglichkeit: stackoverflow.com/questions/4263375/…
Chepech

Antworten:


921
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();
}

11
Ich habe das Bild auch auf 100 Prozent komprimiert und wenn ich mein Bild auf Leinwand bekomme, ist es sehr klein. irgendeinen Grund?
AZ_

3
@Aizaz Dies ändert nicht die Größe des Bildes, sondern nur das Format und die (potenzielle) Qualität. Es ist auch erwähnenswert, dass die Komprimierungsqualität 90im obigen Beispiel beim Speichern als PNG keine Auswirkungen hat, aber für JPEGs einen Unterschied macht. Im Falle eines JPEG können Sie eine beliebige Zahl zwischen 0 und 100 wählen.
Pflüger

1
Es sollte beachtet werden, dass das Speichern auf diese Weise für .JPEG mit 100% Qualität tatsächlich ein anderes Bild als das Original im Web speichert (was zumindest viel mehr Platz beansprucht). Erwägen Sie einen alternativen Ansatz.
Warpzit

42
Muss man haben erneut zu komprimieren? Ich möchte nur das Originalbild speichern.
Hein du Plessis

2
@ HeinduPlessis Muss nicht, aber du solltest es wahrscheinlich. Das Speichern der unformatierten Bitmap benötigt je nach Format viel mehr Speicherplatz (z. B. ARGB_4444 oder ARGB_8888).
Irwinb

134

Sie sollten die Bitmap.compress()Methode verwenden, um eine Bitmap als Datei zu speichern. Es wird Ihr Bild komprimieren (sofern das verwendete Format dies zulässt) und in einen OutputStream verschieben.

Hier ist ein Beispiel für eine Bitmap-Instanz getImageBitmap(myurl), die 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());

@JoaquinG Gibt es einen Grund dafür, fOut.flush()ist es nicht möglich, es wegzulassen?
Niklas

@Niklas Ich denke, dass Sie Flush weglassen können.
JoaquinG

1
Sie sollten den Wortlaut von "Komprimierungsrate von 85%" in "Qualitätsrate von 85%" ändern, um weniger Mehrdeutigkeiten zu vermeiden. Ich würde "Komprimierungsrate von 85%" als "15% Qualität" interpretieren, aber der int-Parameter von Bitmap.compressgibt die Qualität an.
Tim Cooke

Können Sie bitte die Methode postengetImageBitmap(myurl)
Aashish

38
outStream = new FileOutputStream(file);

löst eine Ausnahme ohne Erlaubnis in AndroidManifest.xml aus (zumindest in os2.2):

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

10
Nicht wenn Ihre Datei absolutePath ein interner Pfad ist?
Blundell

24

Innen 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();
}

7
Sie nennen es "pippo.jpg", aber Sie verwenden PNG-Komprimierung
Ralphleon

1
Das Komprimierungsformat sollte .JPEG sein, wenn Sie die Qualität der Bitmap ändern möchten. Die Qualität kann im PNG-Format nicht geändert werden.
Mustafa Güven

13

Einige Formate, wie z. B. verlustfreies PNG, ignorieren die Qualitätseinstellung.


2
PNG ist immer noch ein komprimiertes Format. Ändert die Qualitätseinstellung nicht die Komprimierungsqualität?
Tamás Barta

Der Dokumentenzustand (von mir hervorgehoben): Hinweis zum Kompressor, 0-100. 0 bedeutet Komprimierung für kleine Größe, 100 bedeutet Komprimierung für maximale Qualität. Einige Formate, wie PNG, das verlustfrei ist, werden die Qualitätseinstellung ignorieren
Stephan Henningsen

10

Hier ist der Beispielcode zum Speichern der Bitmap in einer Datei:

public static File savebitmap(Bitmap bmp) throws IOException {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 60, bytes);
    File f = new File(Environment.getExternalStorageDirectory()
            + File.separator + "testimage.jpg");
    f.createNewFile();
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
    fo.close();
    return f;
}

Rufen Sie nun diese Funktion auf, um die Bitmap im internen Speicher zu speichern.

File newfile = savebitmap(bitmap);;

Ich hoffe es hilft dir. Glückliches Codierleben.


8
Bitmap bbicon;

bbicon=BitmapFactory.decodeResource(getResources(),R.drawable.bannerd10);
//ByteArrayOutputStream baosicon = new ByteArrayOutputStream();
//bbicon.compress(Bitmap.CompressFormat.PNG,0, baosicon);
//bicon=baosicon.toByteArray();

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
OutputStream outStream = null;
File file = new File(extStorageDirectory, "er.PNG");
try {
    outStream = new FileOutputStream(file);
    bbicon.compress(Bitmap.CompressFormat.PNG, 100, outStream);
    outStream.flush();
    outStream.close();
} catch(Exception e) {

}

1
Sie müssen den outStream nicht leeren, wenn Sie dies in der 'compress'-Methode übergeben. Diese Methode wird für Sie tun.
Dharam

7

Warum nicht die Bitmap.compressMethode mit 100 aufrufen (was so klingt, als wäre sie verlustfrei)?


Obwohl es ignoriert wird, sollte es 100 sein. Wenn eines Tages das Komprimierungsformat in ein lockeres geändert wird, stimmt das Bild am ehesten mit dem lockeren überein. Beachten Sie auch, wenn Sie Code haben, der diesen Aufruf abstrahiert, ist dies möglicherweise wichtiger.
ddcruver

2
100% ist mit JPEG, FWIW nicht verlustfrei. Sie können dies überprüfen, indem Sie die Bitmap wiederholt laden und speichern.

5

Ich möchte auch ein Bild speichern. Aber mein Problem (?) Ist, dass ich es aus einer Bitmap speichern möchte, die ich gezeichnet habe.

Ich habe es so gemacht:

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case R.id.save_sign:      

                myView.save();
                break;

            }
            return false;    

    }

public void save() {
            String filename;
            Date date = new Date(0);
            SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddHHmmss");
            filename =  sdf.format(date);

            try{
                 String path = Environment.getExternalStorageDirectory().toString();
                 OutputStream fOut = null;
                 File file = new File(path, "/DCIM/Signatures/"+filename+".jpg");
                 fOut = new FileOutputStream(file);

                 mBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                 fOut.flush();
                 fOut.close();

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

            }catch (Exception e) {
                e.printStackTrace();
            }

 }

Ihre Speichermethode funktioniert nur bei mir. Nachdem Sie einige Stunden verschwendet haben. Vielen Dank, Sir.
Mohammed Sufian

5

Die Art und Weise, wie ich PNG und Transparenz gesendet habe.

String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/CustomDir";
File dir = new File(file_path);
if(!dir.exists())
  dir.mkdirs();

String format = new SimpleDateFormat("yyyyMMddHHmmss",
       java.util.Locale.getDefault()).format(new Date());

File file = new File(dir, format + ".png");
FileOutputStream fOut;
try {
        fOut = new FileOutputStream(file);
        yourbitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();
     } catch (Exception e) {
        e.printStackTrace();
 }

Uri uri = Uri.fromFile(file);     
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
intent.putExtra(Intent.EXTRA_STREAM, uri);

startActivity(Intent.createChooser(intent,"Sharing something")));

Der Wert 85 macht hier keinen Sinn, da PNG verlustfrei ist. In der Dokumentation heißt es: "Einige Formate, wie z.
B.

2

Erstellen Sie eine Video-Miniaturansicht für ein Video. Es kann null zurückgeben, wenn das Video beschädigt ist oder das Format nicht unterstützt wird.

private void makeVideoPreview() {
    Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(videoAbsolutePath, MediaStore.Images.Thumbnails.MINI_KIND);
    saveImage(thumbnail);
}

Verwenden Sie den folgenden Code, um Ihre Bitmap auf einer SD-Karte zu speichern

Bild speichern

private void storeImage(Bitmap image) {
    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        Log.d(TAG,
                "Error creating media file, check storage permissions: ");// e.getMessage());
        return;
    } 
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        image.compress(Bitmap.CompressFormat.PNG, 90, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }  
}

So ermitteln Sie den Pfad für die Bildspeicherung

/** Create a File for saving an image or video */
private  File getOutputMediaFile(){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this. 
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files"); 

    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    } 
    // Create a media file name
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    File mediaFile;
        String mImageName="MI_"+ timeStamp +".jpg";
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);  
    return mediaFile;
} 

2

Sie möchten Bitmap in einem Verzeichnis Ihrer Wahl speichern. Ich habe eine Bibliothek ImageWorker erstellt, mit der der Benutzer Bitmaps / Drawables / Base64-Bilder laden, speichern und konvertieren kann.

Min SDK - 14

Voraussetzung

  • Das Speichern von Dateien würde die Berechtigung WRITE_EXTERNAL_STORAGE erfordern.
  • Das Abrufen von Dateien erfordert die Berechtigung READ_EXTERNAL_STORAGE.

Speichern von Bitmap / Drawable / Base64

ImageWorker.to(context).
    directory("ImageWorker").
    subDirectory("SubDirectory").
    setFileName("Image").
    withExtension(Extension.PNG).
    save(sourceBitmap,85)

Bitmap wird geladen

val bitmap: Bitmap? = ImageWorker.from(context).
    directory("ImageWorker").
    subDirectory("SubDirectory").
    setFileName("Image").
    withExtension(Extension.PNG).
    load()

Implementierung

Abhängigkeiten hinzufügen

In Projektebene Gradle

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

In Application Level Gradle

dependencies {
            implementation 'com.github.ihimanshurawat:ImageWorker:0.51'
    }

Weitere Informationen finden Sie unter https://github.com/ihimanshurawat/ImageWorker/blob/master/README.md


1

Hey, gib einfach den Namen für .bmp

Mach das:

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
_bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes);

//you can create a new file name "test.BMP" in sdcard folder.
File f = new File(Environment.getExternalStorageDirectory()
                        + File.separator + "**test.bmp**")

Es hört sich so an, als würde ich mich nur darum kümmern, aber versuchen Sie es, sobald es in bmp foramt gespeichert wird


1

Stellen Sie sicher, dass das Verzeichnis erstellt wurde, bevor Sie Folgendes aufrufen bitmap.compress:

new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();

1

Nach Android 4.4 Kitkat und ab 2017 beträgt der Anteil von Android 4.4 und weniger etwa 20% und nimmt ab. Es ist nicht möglich, mit FileKlasse und getExternalStorageDirectory()Methode auf einer SD-Karte zu speichern . Diese Methode gibt den internen Speicher Ihres Geräts zurück und speichert Bilder, die für jede App sichtbar sind. Sie können Bilder auch nur privat in Ihrer App speichern und löschen, wenn der Benutzer Ihre App mit der openFileOutput()Methode löscht .

Ab Android 6.0 können Sie Ihre SD-Karte als internen Speicher formatieren, jedoch nur privat für Ihr Gerät. (Wenn Sie das SD-Auto als internen Speicher formatieren, kann nur Ihr Gerät auf dessen Inhalt zugreifen oder diesen anzeigen.) Sie können mit auf dieser SD-Karte speichern andere Antworten, aber wenn Sie eine austauschbare SD-Karte verwenden möchten, sollten Sie meine Antwort unten lesen.

Sie sollten Storage Access Framework verwenden , um die onActivityResultAktivitätsmethode uri to folder abzurufen, um den Ordner vom Benutzer auswählen zu lassen, und eine dauerhafte Berechtigung zum Abrufen hinzufügen, um nach dem Neustart des Geräts durch den Benutzer auf den Ordner zugreifen zu können.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {

        // selectDirectory() invoked
        if (requestCode == REQUEST_FOLDER_ACCESS) {

            if (data.getData() != null) {
                Uri treeUri = data.getData();
                tvSAF.setText("Dir: " + data.getData().toString());
                currentFolder = treeUri.toString();
                saveCurrentFolderToPrefs();

                // grantUriPermission(getPackageName(), treeUri,
                // Intent.FLAG_GRANT_READ_URI_PERMISSION |
                // Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                final int takeFlags = data.getFlags()
                        & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                // Check for the freshest data.
                getContentResolver().takePersistableUriPermission(treeUri, takeFlags);

            }
        }
    }
}

Speichern Sie nun den Speicherordner in den freigegebenen Einstellungen, damit der Benutzer nicht jedes Mal, wenn Sie ein Bild speichern möchten, aufgefordert wird, einen Ordner auszuwählen.

Sie sollten DocumentFileclass verwenden, um Ihr Bild zu speichern, nicht, Fileoder ParcelFileDescriptorfür weitere Informationen können Sie diesen Thread überprüfen, um das Bild mit compress(CompressFormat.JPEG, 100, out);Methode und DocumentFileKlassen auf einer SD-Karte zu speichern .


1

Einige neue Geräte speichern keine Bitmap. Deshalb habe ich etwas mehr erklärt.

Stellen Sie sicher, dass Sie unten Berechtigung hinzugefügt haben

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

und erstellen Sie eine XML-Datei unter dem xmlOrdnernamen provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
</paths>

und in AndroidManifest unter

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

Rufen Sie dann einfach saveBitmapFile (passYourBitmapHere) auf.

public static void saveBitmapFile(Bitmap bitmap) throws IOException {
        File mediaFile = getOutputMediaFile();
        FileOutputStream fileOutputStream = new FileOutputStream(mediaFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, getQualityNumber(bitmap), fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    }

wo

File getOutputMediaFile() {
        File mediaStorageDir = new File(
                Environment.getExternalStorageDirectory(),
                "easyTouchPro");
        if (mediaStorageDir.isDirectory()) {

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                    .format(Calendar.getInstance().getTime());
            String mCurrentPath = mediaStorageDir.getPath() + File.separator
                            + "IMG_" + timeStamp + ".jpg";
            File mediaFile = new File(mCurrentPath);
            return mediaFile;
        } else { /// error handling for PIE devices..
            mediaStorageDir.delete();
            mediaStorageDir.mkdirs();
            galleryAddPic(mediaStorageDir);

            return (getOutputMediaFile());
        }
    }

und andere Methoden

public static int getQualityNumber(Bitmap bitmap) {
        int size = bitmap.getByteCount();
        int percentage = 0;

        if (size > 500000 && size <= 800000) {
            percentage = 15;
        } else if (size > 800000 && size <= 1000000) {
            percentage = 20;
        } else if (size > 1000000 && size <= 1500000) {
            percentage = 25;
        } else if (size > 1500000 && size <= 2500000) {
            percentage = 27;
        } else if (size > 2500000 && size <= 3500000) {
            percentage = 30;
        } else if (size > 3500000 && size <= 4000000) {
            percentage = 40;
        } else if (size > 4000000 && size <= 5000000) {
            percentage = 50;
        } else if (size > 5000000) {
            percentage = 75;
        }

        return percentage;
    }

und

void galleryAddPic(File f) {
        Intent mediaScanIntent = new Intent(
                "android.intent.action.MEDIA_SCANNER_SCAN_FILE");
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);

        this.sendBroadcast(mediaScanIntent);
    }

Haben Sie weitere Informationen zu error handling for PIE devices..und ich denke, die Rekursion in getOutputMediaFilekönnte eine Endlosschleife sein, wenn die Problemumgehung fehlschlägt.
Raimund Wege

0

Speichern Sie Bitmap in Ihrer Galerie ohne Komprimierung.

private File saveBitMap(Context context, Bitmap Final_bitmap) {
    File pictureFileDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Your Folder Name");
    if (!pictureFileDir.exists()) {
        boolean isDirectoryCreated = pictureFileDir.mkdirs();
        if (!isDirectoryCreated)
            Log.i("TAG", "Can't create directory to save the image");
        return null;
    }
    String filename = pictureFileDir.getPath() + File.separator + System.currentTimeMillis() + ".jpg";
    File pictureFile = new File(filename);
    try {
        pictureFile.createNewFile();
        FileOutputStream oStream = new FileOutputStream(pictureFile);
        Final_bitmap.compress(Bitmap.CompressFormat.PNG, 100, oStream);
        oStream.flush();
        oStream.close();
        Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue saving the image.");
    }
    scanGallery(context, pictureFile.getAbsolutePath());
    return pictureFile;
}
private void scanGallery(Context cntx, String path) {
    try {
        MediaScannerConnection.scanFile(cntx, new String[]{path}, null, new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue scanning gallery.");
    }
}

-1

// | == | Erstellen Sie eine PNG-Datei aus Bitmap:

void devImjFylFnc(String pthAndFylTtlVar, Bitmap iptBmjVar)
{
    try
    {
        FileOutputStream fylBytWrtrVar = new FileOutputStream(pthAndFylTtlVar);
        iptBmjVar.compress(Bitmap.CompressFormat.PNG, 100, fylBytWrtrVar);
        fylBytWrtrVar.close();
    }
    catch (Exception errVar) { errVar.printStackTrace(); }
}

// | == | Holen Sie sich Bimap aus Datei:

Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar)
{
    return BitmapFactory.decodeFile(pthAndFylTtlVar);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.