Android

AndroidでBitmapの一時保存

More than 3 years have passed since last update.


画像の一時保存の方法

画像処理するアプリを作成する場合、

カメラやギャラリーで取り込んだ元のデータを一時的にもっておきたい時があります。

そのときメンバー変数にBitmapをもっておくと、ある程度でかい画像をもっておくと

すぐにOutOfMemoryがおきてしまいます。

いままでに一時的にデータを保持する方法をいろいろ試したのでメモしておく。


メンバー変数


メリット


  • 簡単


デメリット


  • アクティビティ終了されたらきえる

  • メモリにやさしくない


コード

private Bitmap cache;


ファイルに書き出す


メリット

-メモリ優しい


デメリット


  • 残ってしまった時に、ギャラリーで表示されてしまう


コード

 try {

// sdcardフォルダを指定
File root = Environment.getExternalStorageDirectory();

// 日付でファイル名を作成 
Date mDate = new Date();
SimpleDateFormat fileName = new SimpleDateFormat("yyyyMMdd_HHmmss");

// 保存処理開始
FileOutputStream fos = null;
fos = new FileOutputStream(new File(root, fileName.format(mDate) + ".jpg"));

// jpegで保存
mBitmap.compress(CompressFormat.JPEG, 100, fos);

// 保存処理終了
fos.close();
} catch (Exception e) {
Log.e("Error", "" + e.toString());
}


SharedPreferencesに書き出す


メリット


  • メモリにやさしい

  • ホームボタンやアクティビティ終了されても、変な途中成果物がギャラリーで表示されない


コード

書き出し

Bitmap bitmap = ... //保存したいBitmap

ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
String bitmapStr = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);

context.getSharedPreferences("hogehoge", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString("key", bitmapStr);
editor.apply();

読み込み

context.getSharedPreferences("hogehoge", Context.MODE_PRIVATE);

SharedPreferences pref = createSharedPreferences(context);
String s = pref.getString("key", "");
if (!s.equals("")) {
  BitmapFactory.Options options = new BitmapFactory.Options();
  byte[] b = Base64.decode(s, Base64.DEFAULT);
  Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length).copy(Bitmap.Config.ARGB_8888, true);
}


まとめ

現状はSharedPreferencesで保存する方法が一番安定している。

もちろんアプリ管理からデータ削除されればきえるので、あくまでもキャッシュです。

それはファイルでもっているときも同じですので。。。


追記

@eneim さんより情報いただきました。

ありがとうございます。

まだ試してないのでなんともですが、

キャッシュに関していろいろあるみたいです。。

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html