Мне нужно экспортировать некоторые файлы Drawable
в файл.
Например, у меня есть функция, которая возвращает мне объект Drawable
. Я хочу записать его в файл в /sdcard/drawable/newfile.png
. Как я могу это сделать?
Мне нужно экспортировать некоторые файлы Drawable
в файл.
Например, у меня есть функция, которая возвращает мне объект Drawable
. Я хочу записать его в файл в /sdcard/drawable/newfile.png
. Как я могу это сделать?
Хотя лучший ответ здесь имеет хороший подход. Это только ссылка. Здесь вы можете сделать следующие шаги:
Вы можете сделать это, по крайней мере, двумя разными способами, в зависимости от того, откуда вы получаете Drawable
.
res/drawable
папках.Предположим, вы хотите использовать Drawable
, который находится в ваших папках с возможностью выбора. Вы можете использовать BitmapFactory#decodeResource
. Пример ниже.
Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.your_drawable);
PictureDrawable
.Если вы получаете PictureDrawable
из другого места во время выполнения, вы можете использовать Bitmap#createBitmap
, чтобы создать Bitmap
. Как показано ниже.
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;
}
Как только у вас есть объект Bitmap
, его можно сохранить в постоянном хранилище. Вам просто нужно выбрать формат файла (JPEG, PNG или 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;
}
И чтобы получить целевой каталог, попробуйте что-то вроде:
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.");
}
Обс: Не забудьте сделать такую работу в фоновом потоке, если вы имеете дело с большими изображениями или многими изображениями, потому что может потребоваться некоторое время для завершения и может заблокировать ваш пользовательский интерфейс, делая ваше приложение невосприимчивым.
получить изображение, сохраненное в SD-карте.
File imgFile = new File("/sdcard/Images/test_image.jpg");
if(imgFile.exists()){
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
ImageView myImage = (ImageView) findViewById(R.id.imageviewTest);
myImage.setImageBitmap(myBitmap);
}
String path = Environment.getExternalStorageDirectory()+ "/Images/test.jpg";
File imgFile = new File(path);