2017-02-17 1 views
1

の多くのPNG形式(様々なフラグメントには約6~7回使用)。 画像は、私の目的のために小さくしなければならないので、私はクリッカブルエリアボタンのサイズを大きくするが、イメージを保つことができるように、私は画像の周囲余分な透明領域に置くことによって、私のイメージの面積を増加させました小さい(私はそれが効率的でないことを知っていますし、それ以来私はこれを達成するためのより良い方法を考案しました)。巨大なスパイク使用して、私は私のアプリでCopyToClipboard機能について<strong>PNG背景</strong>で<strong>ボタン</strong>を使用しています透明領域

私は、後でいくつかの他のイメージ(150kbサイズの大きなイメージ)をアップロードした後、巨大なスパイクを発見しました。そして、多くのデバッグの後で(私はたくさんのことを意味します)大きな画像が8kbのサイズだったCopyToClipboard画像のために!古いCopyToClipboardイメージ(透明領域が小さい)に戻すと、メモリ消費量が正常に戻りました。

私の質問はなぜそれがを起こったのですか?そのような小さな画像(このような巨大なスパイクを作成するには(より前にメモリ消費量を倍にして)とアプリを遅くした、非常に困惑です。

画像は次のとおりです。白い部分は透明な部分です。私のボタンの寸法:15dp x 15dp。

enter image description here

私は私の質問は、なぜそれが起こるのですか?ある、繰り返し私はすでに問題を解決して以来、解決策ではありません。

答えて

1

イメージがデコードされるときにはるかに多くのメモリが必要になるため、イメージはディスク上に7-8KBしかありません。

明らかに、大きな透明領域はPNGファイルで効率的にエンコードできるため、画像のサイズは小さくなります。 しかし、実際には次元は(600 x 745)ですから、メモリには約600 MB(745 * 4)バイトに加えていくつかのメタ情報があり、それゆえ2 MB近くになります。 4乗数は、アルファチャンネルで色をエンコードするのに必要なバイト数を表します。 Androidビットマップは整数の線形1次元配列で内部的に表現されるため、ビットマップを作成するにはシステムがサイズ600 * 745 = 447000の配列を割り当てる必要があると考えられます。

そのような単純なイメージでは、メモリ消費量が非常に高いのです。

+0

私はそれが解決策とは関係があるかもしれない愚直さがありました。基本的には、画像の解像度が非常に高く、そのビットマップ内の内部ストレージが**その効果をもたらしたため、このスパイクが発生したと私に伝えていますか? –

+0

@KaushikNP、基本的にはい。しかし、それはAndroidやBitmapのようなものではなく、ビットマップがメモリ内で表現される方法です。ピクセルの生の配列です。ディスク上にある間、それらは効率的に符号化された構造体として表されるので、はるかに少ないスペースしか取らない。 – Dimezis

+0

Dimezisありがとうございました。実際には両方の画像の解像度に大きなばらつきがあるので、これが最も可能性が高いと思われます。間違い私はビットマップのための解決に考慮を払っていませんでしたが、ちょうどサイズをチェックしていた。 –

関連する問題