Подтвердить что ты не робот

Как написать ресурс Drawable в файл?

Мне нужно экспортировать некоторые файлы Drawable в файл.

Например, у меня есть функция, которая возвращает мне объект Drawable. Я хочу записать его в файл в /sdcard/drawable/newfile.png. Как я могу это сделать?

4b9b3361

Ответ 1

Хотя лучший ответ здесь имеет хороший подход. Это только ссылка. Здесь вы можете сделать следующие шаги:

Преобразование Drawable в Bitmap

Вы можете сделать это, по крайней мере, двумя разными способами, в зависимости от того, откуда вы получаете Drawable.

  • Настраивается в res/drawable папках.

Предположим, вы хотите использовать Drawable, который находится в ваших папках с возможностью выбора. Вы можете использовать BitmapFactory#decodeResource. Пример ниже.

Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.your_drawable);
  1. У вас есть объект 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.");
}

Обс: Не забудьте сделать такую ​​работу в фоновом потоке, если вы имеете дело с большими изображениями или многими изображениями, потому что может потребоваться некоторое время для завершения и может заблокировать ваш пользовательский интерфейс, делая ваше приложение невосприимчивым.

Ответ 3

получить изображение, сохраненное в 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);