下载同一张图片,在windows中可以看到图片文件的大小是102K的,而inputStream通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存。而我直接用FileOutputStream把inputStream写入文件,文件大小是102k和windows里的一样,请问这种情况怎么造成的?
巴扎黑2017-04-17 17:49:36
まず最初に、2 つの概念を明確にする必要があります。
1. ビットマップ: ここで私が理解しているのは、Android システムのビットマップ画像形式であり、通常はメモリ内にのみ存在し、システムが表示するために使用されます。画像;
2. ファイル: ハードディスクまたはフラッシュ上に存在するファイル。通常は jpeg や png などの圧縮方法が使用されます。
ここでは、比較して説明するための例として jpeg とビットマップを使用します。
jpeg は圧縮されており、保存に適していますが、直接表示できないため、表示する前にデコードする必要があります。
ビットマップは、圧縮されていない画像なので、表示に適しています。ストレージ容量が多すぎるため、保存には適していません。
表示される現象を説明しましょう:
Windows では、画像ファイルのサイズが 102K であることがわかります : これは圧縮ファイルです。
BitmapFactory を使用します。 decodeStream () メソッドはビットマップに変換しますが、750k のメモリを割り当てます。 : このとき、圧縮ファイルはメモリ上でビットマップ ファイルに解凍され、解凍後に占有されるスペースがビットマップ ファイルになります。具体的には、どのくらい大きくなるか、okadanana の回答で以前に非常に明確になりました。
FileOutputStream を直接使用してファイルに inputStream を書き込み、ファイル サイズは 102k です。デコードせずにメモリに書き込むと、ファイルはそのまま書き込まれます。もちろんサイズは変わりません。
PHP中文网2017-04-17 17:49:36
画像はピクセルで構成されているため、画像のサイズを計算するには、次の 3 つのパラメータを知る必要があります:
画像の長さ
画像の幅
各ピクセルが占有するメモリサイズ
したがって、式
画像が占有するメモリサイズ = 画像の長さ x 画像の幅 x 各ピクセルが占有するメモリサイズ
Android では、各ピクセルが占めるメモリ サイズは、4 つの構成を持つ Bitmap.Config によって決定されます
配置 | 占用的字节数 |
---|---|
Bitmap.Config.ALPHA_8 | 一个像素1个字节 |
Bitmap.Config.ARGB_4444 | 一个像素2个字节 |
Bitmap.Config.RGB_565 | 一个像素2个字节 |
Bitmap.Config.ARGB_8888 | 一个像素4个字节 |
つまり、BitmapFactory.decodeStream()
によって生成されるビットマップのサイズに影響を与えるのは Bitmap.Config
です。したがって、読み取られるサイズも当然異なります。