Frage

ich auf einer Funktion arbeite ein Bild von einem Webserver herunterzuladen, auf dem Bildschirm angezeigt werden, und wenn der Benutzer das Bild behalten mag, ist es auf der SD-Karte in einem bestimmten Ordner speichern. Gibt es eine einfache Möglichkeit, ein Bitmap zu nehmen und es nur in einem Ordner meiner Wahl auf die SD-Karte speichern?

Mein Problem ist, dass ich das Bild herunterladen kann, es auf dem Bildschirm als Bitmap angezeigt werden soll. Die einzige Art, wie ich in der Lage gewesen zu finden, ein Bild zu einem bestimmten Ordner zu speichern ist Outputstream zu verwenden, aber das erfordert einen Byte-Array. Ich bin nicht sicher, wie zu konvertieren (wenn dies auch der richtige Weg) von Bitmap zu Byte-Array, so kann ich einen Fileoutputstream verwenden, um die Daten zu schreiben.

Die andere Option, die ich habe, sind Mediastor zu verwenden:

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

Welche funktioniert auf SD-Karte zu speichern, aber erlauben Sie nicht, den Ordner anpassen.

War es hilfreich?

Lösung

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

Andere Tipps

Sie sollten die Bitmap.compress() Methode verwenden, um eine Bitmap als Datei zu speichern. Es wird komprimieren (wenn das verwendete Format erlaubt es) Ihr Bild und drücken Sie sie in einen Output.

Hier ist ein Beispiel für eine Bitmap-Instanz durch getImageBitmap(myurl) erhalten, die als JPEG mit einer Kompressionsrate von 85% zusammengedrückt 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());
outStream = new FileOutputStream(file);

wird Ausnahme ohne Erlaubnis in AndroidManifest.xml werfen (zumindest in OS2.2):

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

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

Einige Formate wie PNG, die verlustfrei ist, werden die Bildqualitätseinstellung ignorieren.

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

}

Hier ist der Beispielcode Bitmap für das Speichern in 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;
}

Nun diese Funktion rufen Sie die Bitmap in dem internen Speicher zu speichern.

File newfile = savebitmap(bitmap);

Ich hoffe, es wird Ihnen helfen. Glücklich codeing Leben.

Warum die Bitmap.compress Methode nicht nennen mit 100 (die wie klingt es lossless ist)?

Ich möchte auch ein Bild speichern. Aber mein Problem (?) Ist, dass ich es von einem Bitmap speichern möchten, die drawed ive.

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

 }

Die Art und Weise fand ich PNG und Transparenz 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")));

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

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

Ihre Bitmap zum Speichern in sdcard den folgenden Code verwenden

Speichern Bild

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

, um den Pfad für Bildspeicherung Get

/** 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;
} 

Hey gibt nur den Namen .bmp

Tun Sie dies:

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 wird klingen, dass im nur Herumalbern, aber versuchen Sie es, sobald es in bmp foramt..Cheers gerettet werden wird

Stellen Sie sicher, dass das Verzeichnis erstellt wird, bevor Sie bitmap.compress nennen:

new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();
mit File Klasse und getExternalStorageDirectory() Methode

Nach dem Android 4.4 Kitkat, und ab 2017 Anteil von Android 4.4 und weniger beträgt etwa 20% und verringert, ist es nicht möglich, auf SD-Karte zu speichern. Diese Methode gibt das Gerät interne Speicher und Bilder zu jeder App sichtbar speichern. Sie können auch nur privat zu Ihrer App Bilder speichern und gelöscht werden, wenn der Benutzer die App mit openFileOutput() Methode löscht.

Beginnend mit Android 6.0 können Sie Ihre SD-Karte als internen Speicher formatiert werden, sondern auf das Gerät nur privat. (Wenn Sie SD-Auto als interner Speicher formatiert werden, nur Ihr Gerät kann seinen Inhalt zugreifen oder sehen) Sie zu, dass sparen SD-Karte mit anderen Antworten, aber wenn Sie einen austauschbaren SD-Karte verwenden möchten, sollten Sie meine Antwort unten lesen.

Sie sollten verwenden Speicherzugangsrahmen bekommen uri onActivityResult Methode der Aktivität in Ordner Ordner durch den Benutzer ausgewählt werden, und fügen Sie persistiable Erlaubnis retreive der Lage sein, Ordner zuzugreifen, nachdem Benutzer das Gerät neu gestartet.

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

            }
        }
    }
}

Jetzt speichern, Ordner auf gemeinsame Einstellungen speichern nicht vom Benutzer fragen Sie Ordner jedes Mal auswählen möchten, ein Bild speichern.

Sie sollten DocumentFile-Klasse verwenden, um das Bild zu speichern, nicht File oder ParcelFileDescriptor, für weitere Informationen können Sie überprüfen, dieser Thread auf SD-Karte mit compress(CompressFormat.JPEG, 100, out); Verfahren und DocumentFile Klassen Speicher Bild.

Sie möchten Bitmap Verzeichnis Ihrer Wahl zu speichern. Ich habe eine Bibliothek ImageWorker gemacht, die den Benutzer ermöglicht, zu laden, speichern und Bitmaps / Drawables / base64 Bilder umwandeln.

Min SDK - 14

Voraussetzung

  • Speichern von Dateien würde WRITE_EXTERNAL_STORAGE Genehmigung erforderlich.
  • Abrufen von Dateien würden READ_EXTERNAL_STORAGE Genehmigung erforderlich.

Speichern von Bitmap / Drawable / Base64

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

Laden Bitmap

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

Die Umsetzung

Add-Abhängigkeiten

Projektebene Gradle

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

In der Anwendungsebene Gradle

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

Sie können lesen Sie mehr auf https://github.com/1AboveAll/ ImageWorker / Blob / Master / README.md

  

Einige neue Geräte nicht speichern Bitmap So erklärte ich ein wenig mehr ..

stellen Sie sicher, Sie haben hinzugefügt unter Permission

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

und erstellen Sie eine XML-Datei unter xml Ordnernamen 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>

dann rufen Sie einfach an saveBitmapFile (passYourBitmapHere)

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

Dabei steht

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

Nicht wirklich eine Antwort, aber ein Kommentar. Ich bin auf einem Mac den Emulator-Umgebung ausgeführt wird, und einen java.io.IOException: Zugriff 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 uses-permission android.permission.WRITE_EXTERNAL_STORAGE auf die Manifest-Datei (wie andere schon angemerkt).

Speichern Bitmap zu Ihrer Galerie Ohne Compress.

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

// | == | Erstellen Sie eine PNG-Datei von 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(); }
}

// | == | Erhalten Bimap von Datei:

Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar)
{
    return BitmapFactory.decodeFile(pthAndFylTtlVar);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top