wake-up-neo.net

Bitmap am Speicherort speichern

Ich arbeite an einer Funktion, um ein Bild von einem Webserver herunterzuladen und auf dem Bildschirm anzuzeigen. 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, besteht darin, FileOutputStream zu verwenden. Dies erfordert jedoch ein Byte-Array. Ich bin nicht sicher, wie ich Bitmap in ein Byte-Array konvertieren soll (wenn dies sogar der richtige Weg ist). Daher kann ich einen FileOutputStream verwenden, 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");

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

424
Chrispix
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();
}
850
Ulrich Scheller

Sie sollten die Bitmap.compress()-Methode verwenden, um eine Bitmap als Datei zu speichern. Es komprimiert (wenn das verwendete Format es zulässt) Ihr Bild und drückt es in einen OutputStream.

Hier ist ein Beispiel einer Bitmap-Instanz, die über getImageBitmap(myurl) abgerufen wird und 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());
128
JoaquinG
outStream = new FileOutputStream(file);

wirft eine Ausnahme ohne Erlaubnis in AndroidManifest.xml (zumindest in os2.2)

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
35
user996042

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

Einige Formate, wie beispielsweise das verlustfreie PNG, ignorieren die Qualitätseinstellung.

13
shinydev

Rufen Sie die Bitmap.compress-Methode mit 100 auf (was sich als verlustfrei anhört).

8
TofuBeer
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) {

}
8
Ashish Anand

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. Fröhliches Code-Leben.

8
A-Droid Tech

Ich möchte auch ein Bild speichern. Aber mein Problem (?) Ist, dass ich es von 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();
            }

 }
5
user511895

Der Weg, den ich gefunden habe, um PNG und Transparenz zu senden.

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")));
5
JulienGenoud

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

Um Ihre Bitmap in SD-Karte zu speichern, verwenden Sie den folgenden Code

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 erhalten 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
MashukKhan

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

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

Nach Android 4.4 KitKat und ab 2017 ist der Anteil von Android 4.4 und darunter etwa 20% und sinkt. Es ist nicht möglich, die SD-Karte mithilfe der File-Klasse und der getExternalStorageDirectory()-Methode 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 gelöscht werden, 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 für Ihr Gerät. (Wenn Sie SD-Car als internen Speicher formatieren, kann nur Ihr Gerät auf den Inhalt zugreifen oder dessen Inhalt anzeigen) andere Antworten, aber wenn Sie eine entfernbare SD-Karte verwenden möchten, sollten Sie meine Antwort unten lesen.

Sie sollten Storage Access Framework verwenden, um den URI in den Ordner onActivityResult der Aktivitätsmethode zu setzen, um den vom Benutzer ausgewählten Ordner zu erhalten, und eine dauerhafte dauerhafte Berechtigung hinzufügen, um auf den Ordner zugreifen zu können, nachdem der Benutzer das Gerät neu gestartet hat.

@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 den Ordner "Speichern" nun in den gemeinsamen Einstellungen, damit der Benutzer nicht jedes Mal einen Ordner auswählen muss, wenn Sie ein Bild speichern möchten.

Sie sollten die DocumentFile-Klasse verwenden, um Ihr Bild zu speichern, nicht File oder ParcelFileDescriptor. Weitere Informationen finden Sie in diesem Thread zum Speichern von Bildern auf der SD-Karte mit der compress(CompressFormat.JPEG, 100, out);-Methode und den DocumentFile-Klassen.

1
Thracian

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 erfordert die Berechtigung WRITE_EXTERNAL_STORAGE.
  • Das Abrufen von Dateien erfordert die Berechtigung READ_EXTERNAL_STORAGE.

Bitmap speichern/zeichnen/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 Anwendungsebene Gradle

dependencies {
            implementation 'com.github.1AboveAll:ImageWorker:0.51'
    }

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

1
Himanshu Rawat

Hey, gib einfach den Namen .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 es sich nur um die Welt drehen, aber probieren Sie es, sobald es in bmp foramt..Cheers gespeichert ist

1
Mayank Saini

Eigentlich keine Antwort, sondern ein Kommentar. Ich bin auf einem Mac, der die Emulatorumgebung ausführt, und erhalte eine Java.io.IOException: Berechtigung verweigert - Fehler mit diesem Code:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    Log.d("DEBUG", "onActivityResult called");
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    if(requestCode == 0 && resultCode == RESULT_OK) {
        Log.d("DEBUG", "result is ok");
        try{
            Bitmap map = (Bitmap) imageReturnedIntent.getExtras().get("data");
            File sd = new File(Environment.getExternalStorageDirectory(), "test.png");
            sd.mkdirs();
            sd.createNewFile();
            FileOutputStream out = new FileOutputStream(sd);
            map.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();
        } catch(FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Ich habe auch die Benutzungsberechtigung Android.permission.WRITE_EXTERNAL_STORAGE zur Manifestdatei hinzugefügt (wie von anderen angemerkt). 

0
stian

Bitmap ohne Komprimierung in Ihrer Galerie speichern.

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.");
    }
}
0
Bhavik Nathani

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

stellen Sie sicher, dass Sie unter Permission hinzugefügt haben.

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

und erstellen Sie eine XML-Datei unter xml Ordnername provider_paths.xml  

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

und im 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>

dann einfach saveBitmapFile (passYourBitmapHere) aufrufen

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

woher

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);
    }
0
Xar E Ahmer