天天看点

安卓保存bitmap到本地

在用picasso的时候,想把获取的的bitmap保存到本地:

Picasso.with(getActivity()).load(imgUrls.get(position)).into(new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                Log.i(TAG,"load from==>" +from);
                boolean hasSaved = SaveImg.saveImg(bitmap, "每日看看-"+String.valueOf(position)+".jpeg",getActivity());
                if(hasSaved){
                    Toast.makeText(getActivity(),"已保存至相册^.^",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {

            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {

            }
        });
    }
           

可以看到,在上面的onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from);回调方法中可以拿到从url加载图片的bitmap对象,from参数是 标志图片是从哪儿加载的【可以从内存,磁盘,和网络】。

接着调用SaveImg.saveImg方法,下面就来看看是如何保存bitmap的吧:

public class SaveImg {

    public static boolean saveImg(Bitmap bitmap, String name, Context context) {
        try {
            String sdcardPath = System.getenv("EXTERNAL_STORAGE");      //获得sd卡路径
            String dir = sdcardPath + "/每日看看/";                    //图片保存的文件夹名
            File file = new File(dir);                                 //已File来构建
            if (!file.exists()) {                                     //如果不存在  就mkdirs()创建此文件夹
                file.mkdirs();
            }
            Log.i("SaveImg", "file uri==>" + dir);
            File mFile = new File(dir + name);                        //将要保存的图片文件
            if (mFile.exists()) {
                Toast.makeText(context, "该图片已存在!", Toast.LENGTH_SHORT).show();
                return false;
            }

            FileOutputStream outputStream = new FileOutputStream(mFile);     //构建输出流
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);  //compress到输出outputStream
            Uri uri = Uri.fromFile(mFile);                                  //获得图片的uri
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri)); //发送广播通知更新图库,这样系统图库可以找到这张图片
            return true;

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return false;
    }
}
           

多学一招:

首先文件夹得存在,比如将a.jpeg保存到   sdcard/每日看看/  文件夹里  ,跟上面一样,要判断文件夹存不存在,不存在就要mkdirs()创建它:

File root = new File("sdcard/每日看看/");
            if (!root.exists()) {
                root.mkdirs();
            }
            File a = new File("sdcard/每日看看/a.jpeg");
            FileOutputStream out = new FileOutputStream(a);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)
           

如果只是将a.jpeg保存到sd卡的根目录:

File mFile = new File("sdcard/a.jpeg");
    FileOutputStream mFileOutputStream = new FileOutputStream(mFile);
    bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream); 
           

okay...

继续阅读