Bitmap in Datei konvertieren

127

Ich verstehe, dass die Verwendung BitmapFactoryeine Datei in eine Bitmap konvertieren kann, aber gibt es eine Möglichkeit, ein Bitmap-Bild in eine Datei zu konvertieren?

Mxyk
quelle

Antworten:

82

Versuche dies:

bitmap.compress(Bitmap.CompressFormat.PNG, quality, outStream);

Sieh dir das an

P. Melch
quelle
10
Aber ich will keine FileOutputStream, nur eine Datei. Gibt es einen Weg, dies zu umgehen?
Mxyk
9
Auch was ist quality?
Mxyk
1
Mit einem FileOutputStream schreiben Sie in eine Datei. Siehe developer.android.com/reference/java/io/FileOutputStream.html
Torid
Ich weiß nicht wirklich, was du meinst ... Du verwendest einen FileOutputStream, um eine Datei zu erstellen. Und Sie können eine Dateiinstanz (wie im Beispiel von amsiddh) verwenden, um einen FileOutputStream zu erstellen, in den Sie die Bitmap exportieren können. Damit (eine Dateiinstanz, eine tatsächliche Datei im Dateisystem und der FileOutputStream) sollten Sie alles haben, was Sie brauchen, nicht wahr?
P. Melch
235

Hoffe es wird dir helfen:

//create a file to write bitmap data
File f = new File(context.getCacheDir(), filename);
f.createNewFile();

//Convert bitmap to byte array
Bitmap bitmap = your bitmap;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();

//write the bytes in file
FileOutputStream fos = new FileOutputStream(f);
fos.write(bitmapdata);
fos.flush();
fos.close();
amsiddh
quelle
36
Vergessen Sie nicht, Ihren Ausgabestream zu spülen und zu schließen :)
Ben Holland
3
Code funktioniert gut, aber die Komprimierungsmethode nimmt viel Zeit in Anspruch. Irgendeine Arbeit herum?
Shail Adi
10
Falls sich die Leute fragen, was Qualitätsmetrik ist. Es ist eine Skala von 0 niedrig bis 100, hoch ähnlich wie Photoshop-Export usw. Wie bereits erwähnt, wird es für PNG ignoriert, aber Sie möchten es möglicherweise verwenden CompressFormat.JPEG. Laut Google Doco: 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, ignorieren die Qualitätseinstellung
wired00
3
Wird die Datei aus dem Cache-Verzeichnis automatisch gelöscht?
Shajeel Afzal
1
Warum a verwenden ByteArrayOutputStream, daraus ein Byte-Array abrufen und dann das Array in a schreiben FileOutputStream? Warum nicht einfach das FileOutputStreamin Bitmap.compress?
InsanityOnABun
39
File file = new File("path");
OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.close();
fraggjkee
quelle
java.io.FileNotFoundException: / path: open failed: EROFS (schreibgeschütztes Dateisystem)
Prasad
1
@Prasad stellen Sie sicher, dass Sie einen korrekten Pfad an Ihren File()Konstruktor übergeben.
fraggjkee
Es hat einen Standardpfad?
Nathiel Barros
perfekte Lösung
Xan
Was ist bitmap.compress? Warum gibt diese Funktion das JPEG-Format? und was ist 100?
Rogayeh Hosseini
11

Die Konvertierung Bitmapin Filemuss im Hintergrund erfolgen (NICHT IM HAUPTGEWINDE). Die Benutzeroberfläche hängt speziell dann, wenn die Größe bitmapgroß war

File file;

public class fileFromBitmap extends AsyncTask<Void, Integer, String> {

    Context context;
    Bitmap bitmap;
    String path_external = Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg";

    public fileFromBitmap(Bitmap bitmap, Context context) {
        this.bitmap = bitmap;
        this.context= context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // before executing doInBackground
        // update your UI
        // exp; make progressbar visible
    }

    @Override
    protected String doInBackground(Void... params) {

        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        file = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");
        try {
            FileOutputStream fo = new FileOutputStream(file);
            fo.write(bytes.toByteArray());
            fo.flush();
            fo.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }


    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        // back to main thread after finishing doInBackground
        // update your UI or take action after
        // exp; make progressbar gone

         sendFile(file);

    }
}

Ich nenne es

new fileFromBitmap(my_bitmap, getApplicationContext()).execute();

Sie müssen die filein verwenden onPostExecute.

So ändern Sie das Verzeichnis file, das im Cache gespeichert werden soll:

 file = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");

mit:

file  = new File(context.getCacheDir(), "temporary_file.jpg");
Mohamed Embaby
quelle
1
Dies gibt mir manchmal die Ausnahme "FileNotFound". Ich untersuche immer noch, warum dies passiert. Vielleicht sollten Sie auch in Betracht ziehen, das wile mit der .webp-Erweiterung zu speichern, die etwa 40-50% kleiner ist als JPG
Pranaysharma
Ich nehme an, dass die Ausnahme "FileNotFound" auftritt, wenn im Cache gespeichert wird und der Cache dann irgendwie gelöscht wird (es gibt viele Möglichkeiten, den Cache zu löschen, möglicherweise von einer anderen Anwendung). @Pranaysharma
Mohamed Embaby
Fehlt nicht die execute () nach dem Konstruktor: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza
1
@AndreaLeganza ja es hat gefehlt, ich habe meine Antwort dank dir bearbeitet.
Mohamed Embaby
Das Beibehalten des Contex in AsyncTask kann zu Speicherverlusten führen !!! youtube.com/watch?v=bNM_3YkK2Ws
slaviboy
1

Die meisten Antworten sind zu lang oder zu kurz und erfüllen den Zweck nicht. Für diejenigen, die nach Java- oder Kotlin-Code suchen, um Bitmap in Dateiobjekt zu konvertieren. Hier ist der ausführliche Artikel, den ich zu diesem Thema geschrieben habe. Konvertieren Sie Bitmap in eine Datei in Android

public static File bitmapToFile(Context context,Bitmap bitmap, String fileNameToSave) { // File name like "image.png"
        //create a file to write bitmap data
        File file = null;
        try {
            file = new File(Environment.getExternalStorageDirectory() + File.separator + fileNameToSave);
            file.createNewFile();

//Convert bitmap to byte array
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 0 , bos); // YOU can also save it in JPEG
            byte[] bitmapdata = bos.toByteArray();

//write the bytes in file
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(bitmapdata);
            fos.flush();
            fos.close();
            return file;
        }catch (Exception e){
            e.printStackTrace();
            return file; // it will return null
        }
    }
Asad Ali Choudhry
quelle
0

Hoffe das hilft dir

Klasse MainActivity: AppCompatActivity () {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Get the bitmap from assets and display into image view
    val bitmap = assetsToBitmap("tulip.jpg")
    // If bitmap is not null
    bitmap?.let {
        image_view_bitmap.setImageBitmap(bitmap)
    }


    // Click listener for button widget
    button.setOnClickListener{
        if(bitmap!=null){
            // Save the bitmap to a file and display it into image view
            val uri = bitmapToFile(bitmap)
            image_view_file.setImageURI(uri)

            // Display the saved bitmap's uri in text view
            text_view.text = uri.toString()

            // Show a toast message
            toast("Bitmap saved in a file.")
        }else{
            toast("bitmap not found.")
        }
    }
}


// Method to get a bitmap from assets
private fun assetsToBitmap(fileName:String):Bitmap?{
    return try{
        val stream = assets.open(fileName)
        BitmapFactory.decodeStream(stream)
    }catch (e:IOException){
        e.printStackTrace()
        null
    }
}


// Method to save an bitmap to a file
private fun bitmapToFile(bitmap:Bitmap): Uri {
    // Get the context wrapper
    val wrapper = ContextWrapper(applicationContext)

    // Initialize a new file instance to save bitmap object
    var file = wrapper.getDir("Images",Context.MODE_PRIVATE)
    file = File(file,"${UUID.randomUUID()}.jpg")

    try{
        // Compress the bitmap and save in jpg format
        val stream:OutputStream = FileOutputStream(file)
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream)
        stream.flush()
        stream.close()
    }catch (e:IOException){
        e.printStackTrace()
    }

    // Return the saved bitmap uri
    return Uri.parse(file.absolutePath)
}

}}

brkcnplt
quelle