検索

ホームページ  >  に質問  >  本文

android - BitmapFactory.decodeStream()方法分配内存变大的问题

下载同一张图片,在windows中可以看到图片文件的大小是102K的,而inputStream通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存。而我直接用FileOutputStream把inputStream写入文件,文件大小是102k和windows里的一样,请问这种情况怎么造成的?

迷茫迷茫2773日前675

全員に返信(3)返信します

  • 巴扎黑

    巴扎黑2017-04-17 17:49:36

    まず最初に、2 つの概念を明確にする必要があります。
    1. ビットマップ: ここで私が理解しているのは、Android システムのビットマップ画像形式であり、通常はメモリ内にのみ存在し、システムが表示するために使用されます。画像;
    2. ファイル: ハードディスクまたはフラッシュ上に存在するファイル。通常は jpeg や png などの圧縮方法が使用されます。
    ここでは、比較して説明するための例として jpeg とビットマップを使用します。
    jpeg は圧縮されており、保存に適していますが、直接表示できないため、表示する前にデコードする必要があります。
    ビットマップは、圧縮されていない画像なので、表示に適しています。ストレージ容量が多すぎるため、保存には適していません。

    表示される現象を説明しましょう:
    Windows では、画像ファイルのサイズが 102K であることがわかります : これは圧縮ファイルです。
    BitmapFactory を使用します。 decodeStream () メソッドはビットマップに変換しますが、750k のメモリを割り当てます。 : このとき、圧縮ファイルはメモリ上でビットマップ ファイルに解凍され、解凍後に占有されるスペースがビットマップ ファイルになります。具体的には、どのくらい大きくなるか、okadanana の回答で以前に非常に明確になりました。
    FileOutputStream を直接使用してファイルに inputStream を書き込み、ファイル サイズは 102k です。デコードせずにメモリに書き込むと、ファイルはそのまま書き込まれます。もちろんサイズは変わりません。

    返事
    0
  • PHP中文网

    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 です。したがって、読み取られるサイズも当然異なります。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:49:36

    ダウンロードするのは jpg または png 画像である必要があります。どちらの形式も、デコード後は RGB 形式でメモリに存在します。

    返事
    0
  • キャンセル返事