Bitmap.createBitmap()
でビットマップを作成した理由(ネイティブヒープではより多くのkB)は、BitmapFactory.decodeResource()
でデコードされたビットマップよりも理解できません。Androidのリソースのデコードされたビットマップより大きなビットマップが作成されるのはなぜですか?
私はLG Optimus One(dpiは160、Android 2.2)と一緒に作業しており、割り当てられたメモリはDebug.getNativeHeapAllocatedSize()
です。
私はこの方法でビットマップ(200×200)を作成した場合:
Bitmap createdBitmap = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
そして、ネイティブヒープのサイズは、c増加しました。 160kB。私は(フォルダdrawable-mdpi
から)リソースからPNGの画像(200×200)をデコードした場合
しかし:
Bitmap mdpiBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image_mdpi);
サイズは、c増加しました。 のみ3kB。
drawable-ldpi
からPNGイメージ(150x150)をデコードした場合、アンドロイドはイメージを200x200に拡大し、ネイティブヒープのサイズもcで増加します。 160kB。ビットマップおよびデコード(スケール)ビットマップそれほど大きく作成された理由を誰かが、
を知っていますか?
お返事ありがとうございます。
long createdSizeStart = Debug.getNativeHeapAllocatedSize();
Bitmap createdBitmap = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
long createdSize = Debug.getNativeHeapAllocatedSize() - createdSizeStart;
long resourceMdpiSizeStart = Debug.getNativeHeapAllocatedSize();
Bitmap resourceMdpiBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image_mdpi);
long resourceMdpiSize = Debug.getNativeHeapAllocatedSize() - resourceMdpiSizeStart;
long resourceLdpiSizeStart = Debug.getNativeHeapAllocatedSize();
Bitmap resourceLdpiBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image_ldpi);
long resourceLdpiSize = Debug.getNativeHeapAllocatedSize() - resourceLdpiSizeStart;
Log.i("test", "Created: " + createdSize + " B, " + createdBitmap.getWidth() + "x" + createdBitmap.getHeight());
Log.i("test", "Resource MDPI: " + resourceMdpiSize + " B, " + resourceMdpiBitmap.getWidth() + "x" + resourceMdpiBitmap.getHeight());
Log.i("test", "Resource LDPI: " + resourceLdpiSize + " B, " + resourceLdpiBitmap.getWidth() + "x" + resourceLdpiBitmap.getHeight());
出力である:ここ
私は測定するために使用されるコードである
作成:163952 B、200×200
リソースMDPI:3184 B、200×200
リソースLDPI:164424 B、200x200
はい、そうです、ビットマップのサイズは正しいです。そして、あなたはリソースのプリロードを制御する方法を知っていますか? MDPIデバイス上のLDPIイメージをデコードすると、メモリに2つのイメージ(元のプリロードイメージとスケールアップされたバージョン)が存在するためです。しかし、元の画像は、(単にアップスケーリングされたバージョンを作成するために)使用されることはありません。だから私は元の画像をメモリから取り除き、スケールアップされた画像だけを保持したいと思っています。 – branoholy
どのようにプリロードを制御するのか分かりません。あなたは記憶がなくなっていますか?メモリが不足すると自動的にアンロードまたはGCされます。 –
はい、別のDPIの画像でOOM例外が発生しました。ストリームで画像を読み込み、指定された 'Rect'を使って' Canvas'に描画することで修正して、画像も同じように見えます。しかし、正しい幅と高さにしておく方が良いと思います。だから私は無用なイメージを放っておきたい。 – branoholy