Pytanie Jak mogę zapisać zasób Drawable do pliku?


Muszę trochę wyeksportować Drawable zasoby do pliku.

Na przykład mam funkcję, która zwraca mi a Drawable obiekt. Chcę go zapisać do pliku w /sdcard/drawable/newfile.png. Jak mogę to zrobić?


19
2018-04-16 12:49


pochodzenie


Możesz wypróbować jedną z poniższych odpowiedzi. - Mauker


Odpowiedzi:


Chociaż najlepsza odpowiedź tutaj ma miłe podejście. Tylko link. Oto, jak możesz wykonać te kroki:

Convert Drawable to Bitmap

Możesz to zrobić na co najmniej dwa różne sposoby, w zależności od tego, skąd bierzesz Drawable od.

  1. Szuflada jest włączona res/drawable lornetka składana.

Powiedz, że chcesz użyć a Drawable który znajduje się w folderach do rysowania. Możesz użyć BitmapFactory#decodeResource podejście. Przykład poniżej.

Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.your_drawable);
  1. Masz PictureDrawable obiekt.

Jeśli dostajesz PictureDrawable z innego miejsca "w czasie wykonywania", możesz użyć skrótu Bitmap#createBitmap podejście do tworzenia swojego Bitmap. Podobnie jak w przykładzie poniżej.

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

Zapisz mapę bitową na dysku

Kiedy już masz Bitmap obiekt, możesz zapisać go w pamięci stałej. Musisz tylko wybrać format pliku (JPEG, PNG lub 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;
}

Aby uzyskać docelowy katalog, wypróbuj coś takiego:

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: Pamiętaj, aby wykonywać tę pracę na tle wątku, jeśli masz do czynienia z dużymi obrazami lub wieloma obrazami, ponieważ może to zająć trochę czasu i może zablokować twój interfejs użytkownika, przez co aplikacja przestanie reagować.


23
2017-12-01 17:35



cześć. ta odpowiedź jest pomocna tylko w razie potrzeby. ale jak mogę skopiować zasoby do rysowania wektorowego, takie jak plik, bez bitmapy itp.? - Сергей Грушин


  1. Konwertuj do przeciągnięcia do bitmapy: Jak przekonwertować Drawable na bitmapę?
  2. Zapisz bitmapę w pliku: Zapisz bitmapę w lokalizacji

23
2018-04-16 12:53





pobierz obraz zapisany na sdcard ...

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

}

Aktualizacja:

String path = Environment.getExternalStorageDirectory()+ "/Images/test.jpg"; 
File imgFile = new File(path);

-8
2018-04-16 12:56



Nie używaj stałej ścieżki do katalogu kart SD, zamiast tego powinieneś użyć Environment.getExternalStorageDirectory().getPath(); - Paresh Mayani
Ścieżka ciągu = Environment.getExternalStorageDirectory () + "/Images/test.jpg"; Plik imgFile = new Plik (ścieżka); - Nitesh Khosla
OK, powinieneś użyć zamiast tego ... - Nitesh Khosla
Ok, ale nie chcę czytać pliku z sdcard, chcę napisać zasób do rysowania w pliku ... - Vlatego
całkowicie niepoprawna odpowiedź - Vladyslav Matviienko