Ubah Bitmap ke File

127

Saya mengerti bahwa menggunakan BitmapFactorydapat mengonversi File ke Bitmap, tetapi adakah cara untuk mengonversi gambar Bitmap ke File?

Mxyk
sumber

Jawaban:

82

Coba ini:

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

Lihat ini

P. Melch
sumber
10
Tapi saya tidak ingin FileOutputStream, hanya sebuah File. Apakah ada jalan keluarnya?
Mxyk
9
Juga, apa itu quality?
Mxyk
1
FileOutputStream adalah cara Anda menulis ke file. Lihat developer.android.com/reference/java/io/FileOutputStream.html
Torid
saya tidak begitu tahu apa yang Anda maksud ... Anda menggunakan FileOutputStream untuk membuat file. Dan Anda dapat menggunakan instance File (seperti dalam contoh amsiddh) untuk membuat FileOutputStream yang dapat Anda ekspor bitmapnya. Dengan itu (contoh File, file aktual pada sistem file dan FileOutputStream) Anda harus memiliki semua yang Anda butuhkan, bukan?
P. Melch
235

Semoga ini akan membantu Anda:

//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
sumber
36
jangan lupa untuk menyiram dan menutup aliran keluaran :)
Ben Holland
3
Kode berfungsi dengan baik, tetapi metode kompres membutuhkan banyak waktu. Ada pekerjaan di sekitar?
Shail Adi
10
membuat orang bertanya-tanya apa itu metrik Kualitas. Ini adalah skala 0 rendah hingga 100, tinggi mirip dengan ekspor photoshop dll. Seperti disebutkan, ini diabaikan untuk PNG, tetapi Anda mungkin ingin menggunakannya CompressFormat.JPEG. Sesuai google doco: Petunjuk untuk kompresor, 0-100. 0 artinya kompres untuk ukuran kecil, 100 artinya kompres untuk kualitas maksimal. Beberapa format, seperti PNG yang lossless, akan mengabaikan pengaturan kualitas
wired00
3
Apakah file dari direktori cache akan dihapus secara otomatis?
Shajeel Afzal
1
Mengapa menggunakan a ByteArrayOutputStream, dapatkan array byte dari itu, lalu tulis array ke a FileOutputStream? Mengapa tidak hanya di FileOutputStreamdalam 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.dll
sumber
java.io.FileNotFoundException: / jalur: buka gagal: EROFS (Sistem file hanya-baca)
Prasad
1
@Prasad pastikan Anda meneruskan jalur yang benar ke File()konstruktor Anda .
fraggjkee
Ini memiliki jalur default?
Nathiel Barros
solusi sempurna
Xan
apa itu bitmap.compress? mengapa fungsi ini memberikan format JPEG? dan apa itu 100?
roghayeh hosseini
11

Mengubah Bitmapmenjadi Fileperlu dilakukan di latar belakang (BUKAN DI BENANG UTAMA) itu menggantung UI khususnya jika ukurannya bitmapbesar

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

    }
}

Menyebutnya

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

Anda HARUS menggunakan filedalam onPostExecute.

Untuk mengubah direktori fileuntuk disimpan dalam baris ganti cache:

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

dengan:

file  = new File(context.getCacheDir(), "temporary_file.jpg");
Mohamed Embaby
sumber
1
Ini memberi saya pengecualian "FileNotFound" beberapa kali. Saya masih menyelidiki mengapa ini terjadi. Juga mungkin Anda harus mempertimbangkan untuk menyimpan wile dengan ekstensi .webp yang ukurannya sekitar 40-50% lebih kecil dari JPG
Pranaysharma
Saya kira pengecualian "FileNotFound" terjadi saat menyimpan ke cache lalu entah bagaimana cache dihapus (ada banyak cara untuk menghapus cache, mungkin dengan aplikasi lain) @Pranaysharma
Mohamed Embaby
Tidak melewatkan eksekusi () setelah konstruktor: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza
1
@AndreaLeganza ya itu hilang, saya edit jawaban saya, terima kasih.
Mohamed Embaby
Menjaga Contex di AsyncTask dapat menyebabkan kebocoran memori !!! youtube.com/watch?v=bNM_3YkK2Ws
slaviboy
2

Sebagian besar jawaban terlalu panjang atau terlalu pendek tidak memenuhi tujuan. Bagi mereka yang mencari kode Java atau Kotlin untuk mengonversi bitmap ke Objek File. Berikut adalah artikel rinci yang saya tulis tentang topik tersebut. Ubah Bitmap ke File di 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
sumber
0

Semoga ini bisa membantu Anda

class 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.dll
sumber