2011-06-18 10 views
0

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

答えて

1

"誰かが知っているのはなぜですか? dビットマップがデコードされた(スケーリングされた)のですか?

160KB 200 * 200 * 4バイトのように見えます。あなたの質問は "なぜMDPIビットマップがとても小さいのですか?"

MDPIバージョンは、コードのいくつかの他の作品で、以前にロードされており、このデータが再利用されているのだろうか。

+0

はい、そうです、ビットマップのサイズは正しいです。そして、あなたはリソースのプリロードを制御する方法を知っていますか? MDPIデバイス上のLDPIイメージをデコードすると、メモリに2つのイメージ(元のプリロードイメージとスケールアップされたバージョン)が存在するためです。しかし、元の画像は、(単にアップスケーリングされたバージョンを作成するために)使用されることはありません。だから私は元の画像をメモリから取り除き、スケールアップされた画像だけを保持したいと思っています。 – branoholy

+0

どのようにプリロードを制御するのか分かりません。あなたは記憶がなくなっていますか?メモリが不足すると自動的にアンロードまたはGCされます。 –

+0

はい、別のDPIの画像でOOM例外が発生しました。ストリームで画像を読み込み、指定された 'Rect'を使って' Canvas'に描画することで修正して、画像も同じように見えます。しかし、正しい幅と高さにしておく方が良いと思います。だから私は無用なイメージを放っておきたい。 – branoholy

3
BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inScaled=false; 
Bitmap bitmap; 
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.whatever, options); 

なく、あなたの意図が何であるかを確認してくださいあまりにも...上記のコードは、実際のサイズでビットマップR.drawable.whateverを作成します...あなたが作成したときにそれがあったようにスケーリング...同じ寸法ありませんリソース。

これが役に立ちます。

+0

私はatmで作業しているプロジェクトで私を助けました。ありがとうございました!問題を解決することは本当に役に立ちました。 –

関連する問題