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?
Bien que la meilleure réponse ici ait une belle approche. C'est seulement un lien. Voici comment vous pouvez effectuer les étapes:
Vous pouvez le faire de deux manières différentes au moins, selon l'endroit où vous obtenez le Drawable
.
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);
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;
}
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.