Converti bitmap in file


127

Capisco che l'utilizzo BitmapFactorypuò convertire un file in un bitmap, ma esiste un modo per convertire un'immagine bitmap in un file?

Risposte:


82

Prova questo:

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

Guarda questo


10
Ma non voglio un FileOutputStream, solo un file. C'è un modo per aggirare questo?
Mxyk

9
Inoltre, cos'è quality?
Mxyk

1
Un FileOutputStream è il modo in cui scrivi su un file. Vedi developer.android.com/reference/java/io/FileOutputStream.html
Torid

Non so davvero cosa intendi ... Usi FileOutputStream per creare un file. E puoi usare un'istanza File (come nell'esempio di amsiddh) per creare un FileOutputStream in cui puoi esportare la bitmap. Con quello (un'istanza File, un file effettivo sul filesystem e FileOutputStream) dovresti avere tutto ciò di cui hai bisogno, no?
P.Melch

235

Spero che ti possa aiutare:

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

36
non dimenticare di svuotare e chiudere il flusso di output :)
Ben Holland

3
Il codice funziona bene, ma il metodo di compressione richiede molto tempo. Qualche soluzione?
Shail Adi

10
nel caso in cui le persone si chiedano cosa sia la metrica di qualità. È in scala da 0 a 100, alto simile all'esportazione di Photoshop ecc. Come accennato, è ignorato per PNG, ma potresti volerlo usare CompressFormat.JPEG. Come per google doco: suggerimento per il compressore, 0-100. 0 significa comprimere per piccole dimensioni, 100 significa comprimere per la massima qualità. Alcuni formati, come il PNG senza perdita di dati, ignoreranno l'impostazione della qualità
cablato il

3
Il file dalla directory della cache verrà eliminato automaticamente?
Shajeel Afzal

1
Perché usare a ByteArrayOutputStream, ottenere un array di byte da quello, quindi scrivere l'array in a FileOutputStream? Perché non solo 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();

java.io.FileNotFoundException: / percorso: apertura non riuscita: EROFS (file system di sola lettura)
Prasad

1
@Prasad assicurati di passare un percorso corretto al tuo File()costruttore.
fraggjkee

Ha un percorso predefinito?
Nathiel Barros

soluzione perfetta
Xan

che cos'è bitmap.com? perché questa funzione fornisce il formato JPEG? e qual è 100?
roghayeh hosseini

11

La conversione Bitmapin Filedeve essere eseguita in background (NON NEL FILO PRINCIPALE) si blocca l'interfaccia utente specialmente se bitmapera grande

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

    }
}

Chiamandolo

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

DEVI usare filein onPostExecute.

Per cambiare la directory fileda memorizzare nella cache, sostituire la riga:

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

con :

file  = new File(context.getCacheDir(), "temporary_file.jpg");

1
Questo mi dà l'eccezione "FileNotFound" alcune volte. Sto ancora indagando sul motivo per cui questo accade. Inoltre, forse dovresti considerare di salvare il wile con l'estensione .webp la sua dimensione inferiore di circa il 40-50% rispetto a JPG
Pranaysharma

Suppongo che l'eccezione "FileNotFound" si verifichi quando si salva nella cache, quindi in qualche modo la cache viene cancellata (ci sono molti modi per cancellare la cache, forse da un'altra applicazione) @Pranaysharma
Mohamed Embaby

Non manca l'execute () dopo il costruttore: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza

1
@AndreaLeganza si mancava, ho modificato la mia risposta, grazie a te.
Mohamed Embaby

Mantenere il Contex in AsyncTask può portare a perdite di memoria !!! youtube.com/watch?v=bNM_3YkK2Ws
slaviboy

2

La maggior parte delle risposte sono troppo lunghe o troppo brevi e non soddisfano lo scopo. Per quelli che cercano codice Java o Kotlin per convertire bitmap in oggetto file. Ecco l'articolo dettagliato che ho scritto sull'argomento. Converti bitmap in file 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
        }
    }

0

Spero che questo ti aiuti

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

}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.