0

このリンクをたどることにより、次のコードを作成して、sdcard から大きな画像ビットマップを表示しました。

try {
   InputStream lStreamToImage = context.getContentResolver().openInputStream(Uri.parse(imagePath));
   BitmapFactory.Options options = new BitmapFactory.Options();
   options.inJustDecodeBounds = true;
   BitmapFactory.decodeStream(lStreamToImage, null, options);
   options.inSampleSize = 8; //Decrease the size of decoded image
   options.inPreferredConfig = Bitmap.Config.ARGB_4444;
   options.inJustDecodeBounds = false;
   bitmap = BitmapFactory.decodeStream(lStreamToImage, null, options);
} catch(Exception e){}
image.setImageBitmap(bitmap);

しかし、ビットマップを返していません(nullを返すという意味です)。logcat では、以下のメッセージが繰り返し表示されています

08-02 17:21:04.389: D/skia(19359): --- SkImageDecoder::Factory returned null

options.inJustDecodeBounds行にコメントを付けて再実行すると、問題なく動作しますが、動作が遅くなります。上記の開発者ガイドのリンクには、inJustDecodeBoundsを使用してビットマップを効率的に読み込むように記載されています。

どこが間違っているのか教えてください。

4

1 に答える 1

2

inJustDecodeBoundsビットマップをロードしません。それがポイントです。実際のビットマップをロードせずにビットマップの寸法をロードするため、実際にロードする前にビットマップの前処理やチェックを行うことができます。これは、たとえばメモリの問題があり、ビットマップをロードするとプログラムがクラッシュするかどうかを確認する必要がある場合に役立ちます。

ビットマップの読み込みが遅い理由は、おそらくビットマップが非常に大きく、SD カードが非常に遅いためです。

編集

ドキュメントから:

true に設定すると、デコーダーは null (ビットマップなし) を返しますが、out... フィールドは引き続き設定されるため、呼び出し元はピクセルにメモリを割り当てることなくビットマップをクエリできます。

編集2:

Google が提供する例でコードを見ると、比較的同じことをしているように見えます。null を返す理由は、おそらくInputStream最初のデコードで変更されたため、ビットマップのメモリ アドレスの先頭から開始されていないためです (リソース ID ではなくInputStream.

あなたがここで提供したコードから、これが私が考え出したものです。最初のデコードで得られるものに関係なく、常にサンプル サイズを 8 に設定しています。Google が最初にデコードする理由は、ビットマップの実際のサイズと必要なサイズを把握するためです。彼らは、ビットマップが ZxZ 次元であると判断し、YxY 次元がsamplesize必要であるため、2 番目のデコードから使用する必要がある を計算します。あなたはこれをしていません。ビットマップの寸法を取得しているだけで、使用していません。次に、サンプル サイズをハードコード化された に設定し、8それをハードコード化されたビットマップにスワップしてからARGB_4444、完全なビットマップをメモリにデコードします。つまり、次の 3 行は使用されていません。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(lStreamToImage, null, options);

設定inJustDecodeBoundsすると、ビットマップをメモリに入れることなく、ビットマップの寸法が得られるだけです。それはそれをより効率的にしません。全体をデコードせずにサイズを事前に決定できるため、ビットマップが大きすぎる場合に、より小さなメモリ空間にビットマップをロードできるようにすることを目的としています)。

ビットマップのデコードが遅い理由は、単に CPU の問題かもしれません。ビットマップのサイズによっては、SD カードからビットマップをロードしているInputStreamため、それ自体が遅い操作です。

于 2012-08-02T12:17:33.430 に答える