如何将Drawable资源写入文件?

Vla*_*ego 25 android export drawable

我需要将一些Drawable资源导出到一个文件.

例如,我有一个函数返回给我一个Drawable对象.我想把它写到一个文件中/sdcard/drawable/newfile.png.我该怎么做?

Mau*_*ker 35

虽然这里最好的答案有一个很好的方法.它只是链接.以下是您可以执行以下步骤的方法:

将Drawable转换为位图

你可以通过至少两种不同的方式做到这一点,具体取决于你Drawable从哪里获得.

  1. Drawable在res/drawable文件夹上.

假设您要使用Drawable可绘制文件夹中的内容.你可以使用这种BitmapFactory#decodeResource方法.以下示例.

Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.your_drawable);
Run Code Online (Sandbox Code Playgroud)
  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;
}
Run Code Online (Sandbox Code Playgroud)

将位图保存到磁盘

获得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;
}
Run Code Online (Sandbox Code Playgroud)

要获取目标目录,请尝试以下操作:

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.");
}
Run Code Online (Sandbox Code Playgroud)

Obs:如果你正在处理大型图像或许多图像,请记住在后台线程上进行此类工作,因为它可能需要一些时间才能完成并可能会阻止您的UI,从而使您的应用无响应.


Ser*_*tov 25

  1. 将Drawable转换为位图:如何将Drawable转换为位图?
  2. 将位图保存到文件:将位图保存到位置