web-dev-qa-db-fra.com

Comment puis-je écrire une ressource Drawable dans un fichier?

J'ai besoin d'exporter des ressources Drawable vers un fichier.

Par exemple, j'ai une fonction qui me renvoie un objet Drawable. Je veux l'écrire dans un fichier dans /sdcard/drawable/newfile.png. Comment puis-je le faire?

26
Vlatego

Bien que la meilleure réponse ici ait une belle approche. C'est seulement un lien. Voici comment vous pouvez effectuer les étapes:

Convertir Drawable en Bitmap

Vous pouvez le faire de deux manières différentes au moins, selon l'endroit où vous obtenez le Drawable.

  1. Drawable est activé res/drawable dossiers.

Supposons que vous souhaitez utiliser un Drawable qui se trouve dans vos dossiers dessinables. Vous pouvez utiliser le BitmapFactory#decodeResource approche. Exemple ci-dessous.

Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.your_drawable);
  1. Vous avez un objet PictureDrawable .

Si vous obtenez un PictureDrawable d'ailleurs "à l'exécution", vous pouvez utiliser le Bitmap#createBitmap approche pour créer votre Bitmap. Comme l'exemple ci-dessous.

public Bitmap drawableToBitmap(PictureDrawable pd) {
    Bitmap bm = Bitmap.createBitmap(pd.getIntrinsicWidth(), pd.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bm);
    canvas.drawPicture(pd.getPicture());
    return bm;
}

Enregistrez le bitmap sur le disque

Une fois que vous avez votre objet Bitmap, vous pouvez l'enregistrer dans le stockage permanent. Il vous suffira de choisir le format de fichier (JPEG, PNG ou WEBP).

/**
 * @param dir you can get from many places like Environment.getExternalStorageDirectory() or mContext.getFilesDir() depending on where you want to save the image.
 * @param fileName The file name.
 * @param bm The Bitmap you want to save.
 * @param format Bitmap.CompressFormat can be PNG,JPEG or WEBP.
 * @param quality quality goes from 1 to 100. (Percentage).
 * @return true if the Bitmap was saved successfully, false otherwise.
 */
boolean saveBitmapToFile(File dir, String fileName, Bitmap bm, 
    Bitmap.CompressFormat format, int quality) {

    File imageFile = new File(dir,fileName);

    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(imageFile);

        bm.compress(format,quality,fos);

        fos.close();

        return true;
    }
    catch (IOException e) {
        Log.e("app",e.getMessage());
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
    return false;
}

Et pour obtenir le répertoire cible, essayez quelque chose comme:

File dir = new File(Environment.getExternalStorageDirectory() + File.separator + "drawable");

boolean doSave = true;
if (!dir.exists()) {
    doSave = dir.mkdirs();
}

if (doSave) {
    saveBitmapToFile(dir,"theNameYouWant.png",bm,Bitmap.CompressFormat.PNG,100);
}
else {
    Log.e("app","Couldn't create target directory.");
}

Obs: N'oubliez pas de faire ce genre de travail sur un thread d'arrière-plan si vous avez affaire à de grandes images, ou à de nombreuses images, car cela peut prendre un certain temps pour terminer et peut bloquer votre interface utilisateur, ce qui rend votre application ne répond plus.

31
Mauker
  1. Convertir Drawable en Bitmap: Comment convertir un Drawable en Bitmap?
  2. Enregistrer le bitmap dans un fichier: Enregistrer le bitmap à l'emplacement
25
Sergey Glotov