Convertir Bitmap en fichier

127

Je comprends que l'utilisation BitmapFactorypeut convertir un fichier en bitmap, mais existe-t-il un moyen de convertir une image Bitmap en fichier?

Mxyk
la source

Réponses:

82

Essaye ça:

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

Regarde ça

P.Melch
la source
10
Mais je ne veux pas FileOutputStream, juste un fichier. Y a-t-il un moyen de contourner ceci?
Mxyk
9
Aussi, qu'est-ce que c'est quality?
Mxyk
1
Un FileOutputStream est la façon dont vous écrivez dans un fichier. Voir developer.android.com/reference/java/io/FileOutputStream.html
Torid
Je ne sais pas vraiment ce que vous voulez dire ... Vous utilisez un FileOutputStream pour créer un fichier. Et vous pouvez utiliser une instance de File (comme dans l'exemple de amsiddh) pour créer un FileOutputStream vers lequel vous pouvez exporter le bitmap. Avec cela (une instance de File, un fichier réel sur le système de fichiers et FileOutputStream), vous devriez avoir tout ce dont vous avez besoin, non?
P.Melch
235

J'espère que cela vous aidera:

//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
la source
36
n'oubliez pas de rincer et de fermer votre flux de sortie :)
Ben Holland
3
Le code fonctionne bien, mais la méthode de compression prend beaucoup de temps. Un travail autour?
Shail Adi
10
au cas où les gens se demandent quelle est la métrique de qualité. Il s'agit d'une échelle de 0 à 100, élevée similaire à l'exportation de photoshop, etc. Comme mentionné, elle est ignorée pour PNG, mais vous souhaiterez peut-être l'utiliser CompressFormat.JPEG. Selon google doco: Astuce pour le compresseur, 0-100. 0 signifie compresser pour une petite taille, 100 signifie compresser pour une qualité maximale. Certains formats, comme PNG qui est sans perte,
ignoreront le
3
Le fichier du répertoire de cache sera-t-il supprimé automatiquement?
Shajeel Afzal
1
Pourquoi utiliser a ByteArrayOutputStream, obtenir un tableau d'octets à partir de cela, puis écrire le tableau dans a FileOutputStream? Pourquoi pas juste le FileOutputStreamdedans 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
la source
java.io.FileNotFoundException: / path: open failed: EROFS (système de fichiers en lecture seule)
Prasad
1
@Prasad assurez-vous que vous passez un chemin correct à votre File()constructeur.
fraggjkee
Il a un chemin par défaut?
Nathiel Barros
solution parfaite
Xan
qu'est-ce que bitmap.compress? pourquoi cette fonction donne le format JPEG? et qu'est-ce que 100?
roghayeh hosseini
11

La conversion Bitmapen Filedoit être effectuée en arrière-plan (PAS DANS LE FIL PRINCIPAL), elle bloque l'interface utilisateur spécialement si le fichier bitmapétait grand

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

    }
}

L'appeler

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

vous DEVEZ utiliser le filein onPostExecute.

Pour changer de répertoire de fileà stocker dans la ligne de remplacement du cache:

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

avec :

file  = new File(context.getCacheDir(), "temporary_file.jpg");
Mohamed Embaby
la source
1
Cela me donne parfois une exception "FileNotFound". J'étudie toujours pourquoi cela se produit. Vous devriez peut-être aussi envisager de sauvegarder le wile avec l'extension .webp, sa taille est environ 40 à 50% inférieure à celle de JPG
Pranaysharma
Je suppose qu'une exception "FileNotFound" se produit lorsque vous enregistrez dans le cache, puis que le cache est effacé (il existe de nombreuses façons de vider le cache, peut-être par une autre application) @Pranaysharma
Mohamed Embaby
Il ne manque pas le execute () après le constructeur: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza
1
@AndreaLeganza oui il manquait, j'ai édité ma réponse, grâce à vous.
Mohamed Embaby
Garder le Contex dans AsyncTask peut entraîner des fuites de mémoire !!! youtube.com/watch?v=bNM_3YkK2Ws
slaviboy
2

La plupart des réponses sont trop longues ou trop courtes et ne remplissent pas l'objectif. Pour ceux qui recherchent du code Java ou Kotlin pour convertir un bitmap en objet fichier. Voici l'article détaillé que j'ai écrit sur le sujet. Convertir Bitmap en fichier sous 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
la source
0

J'espère que cela vous aide

classe 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
la source