在Android中保存和读取内部存储器中的位图/图像
我想要做的是将图像保存到手机的内部存储器(不是SD卡) 。
我该怎么做?
我已经从我的应用程序直接从相机图像视图的图像,它的工作正常。
现在我想要的是将图像从图像视图保存到我的android设备的内部存储器,并在需要时访问它。
任何人都可以请指导我如何做到这一点?
我有点新的android,所以请,我会很感激,如果我可以有一个详细的程序。
使用下面的代码将图像保存到内部目录。
private String saveToInternalStorage(Bitmap bitmapImage){
        ContextWrapper cw = new ContextWrapper(getApplicationContext());
         // path to /data/data/yourapp/app_data/imageDir
        File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
        // Create imageDir
        File mypath=new File(directory,"profile.jpg");
        FileOutputStream fos = null;
        try {           
            fos = new FileOutputStream(mypath);
       // Use the compress method on the BitMap object to write image to the OutputStream
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
        } catch (Exception e) {
              e.printStackTrace();
        } finally {
            try {
              fos.close();
            } catch (IOException e) {
              e.printStackTrace();
            }
        } 
        return directory.getAbsolutePath();
    }
说明:
1.目录将以给定的名称创建。 Javadocs用于告知它将在何处创建目录。
2.您必须提供您想要保存的图像名称。
从内部存储器读取文件。 使用下面的代码
private void loadImageFromStorage(String path)
{
    try {
        File f=new File(path, "profile.jpg");
        Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
            ImageView img=(ImageView)findViewById(R.id.imgPicker);
        img.setImageBitmap(b);
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }
}
/**
 * Created by Ilya Gazman on 3/6/2016.
 */
public class ImageSaver {
    private String directoryName = "images";
    private String fileName = "image.png";
    private Context context;
    private boolean external;
    public ImageSaver(Context context) {
        this.context = context;
    }
    public ImageSaver setFileName(String fileName) {
        this.fileName = fileName;
        return this;
    }
    public ImageSaver setExternal(boolean external) {
        this.external = external;
        return this;
    }
    public ImageSaver setDirectoryName(String directoryName) {
        this.directoryName = directoryName;
        return this;
    }
    public void save(Bitmap bitmapImage) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(createFile());
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @NonNull
    private File createFile() {
        File directory;
        if(external){
            directory = getAlbumStorageDir(directoryName);
        }
        else {
            directory = context.getDir(directoryName, Context.MODE_PRIVATE);
        }
        if(!directory.exists() && !directory.mkdirs()){
            Log.e("ImageSaver","Error creating directory " + directory);
        }
        return new File(directory, fileName);
    }
    private File getAlbumStorageDir(String albumName) {
        return new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), albumName);
    }
    public static boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        return Environment.MEDIA_MOUNTED.equals(state);
    }
    public static boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        return Environment.MEDIA_MOUNTED.equals(state) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
    }
    public Bitmap load() {
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(createFile());
            return BitmapFactory.decodeStream(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}
用法
保存:
new ImageSaver(context).
        setFileName("myImage.png").
        setDirectoryName("images").
        save(bitmap);
加载:
Bitmap bitmap = new ImageSaver(context).
        setFileName("myImage.png").
        setDirectoryName("images").
        load();
编辑:
  添加了ImageSaver.setExternal(boolean)以支持基于ImageSaver.setExternal(boolean)示例保存到外部存储。 
今天遇到这个问题,我就是这么做的。 只需使用所需参数调用该函数即可
public void saveImage(Context context, Bitmap bitmap, String name, String extension){
    name = name + "." + extension;
    FileOutputStream fileOutputStream;
    try {
        fileOutputStream = context.openFileOutput(name, Context.MODE_PRIVATE);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        fileOutputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
同样,为了阅读相同的内容,请使用它
public Bitmap loadImageBitmap(Context context,String name,String extension){
    name = name + "." + extension
    FileInputStream fileInputStream
    Bitmap bitmap = null;
    try{
        fileInputStream = context.openFileInput(name);
        bitmap = BitmapFactory.decodeStream(fileInputStream);
        fileInputStream.close();
    } catch(Exception e) {
        e.printStackTrace();
    }
     return bitmap;
}
上一篇: Saving and Reading Bitmaps/Images from Internal memory in Android
下一篇: How to draw a bitmap from sdcard to custom ondraw method
