1

画像をメモリにロードするときに、まったく同じ C# コードが画像を保持するためにより多くのメモリを使用することに他の誰かが気付いたかどうかを確認したいだけです (Java では約 1.5 倍)。

この Java コードの合計メモリ サイズは105.5 MBになります。

Bitmap[] bitmaps = new Bitmap[100];

for (int i = 0; i < 100; i++)
{
    String root = Environment.getExternalStorageDirectory().getAbsolutePath();
    String imagePath = "/evolution/threesixty/216/Edaphosaurus_001.jpg";

    bitmaps[i] = BitmapFactory.decodeFile(root + imagePath);
}

この C# コードの結果は148.1 MBになります。

Bitmap[] bitmaps = new Bitmap[100];

for (int i = 0; i < 100; i++)
{
    string root = Environment.ExternalStorageDirectory.AbsolutePath;
    string imagePath = "/evolution/threesixty/216/Edaphosaurus_001.jpg";

    bitmaps[i] = BitmapFactory.DecodeFile(root + imagePath);
}  

誰かが理由について何か考えを持っていますか? .NET ラッパーが追加のバインディング データなどを保持するためにもう少し使用する可能性があることは理解していますが、それだけではないのでしょうか?

また、副次的な質問として、各イメージはディスク上で60 KBしかないのに、インメモリ バージョンが1 MB なのはなぜですか? 私の読み込み方法がサンプリング/密度チェックを行わないことは知っていますが、それは目的ではありませんでした。100KB未満の画像をロードしても、100KBのメモリスペースを超えてはいけませんか?

これが私が使用している画像です(994x748px @ 300dpi):

画像

4

2 に答える 2

4

100 個の画像に対して 148.1 MB というあなたの数字は、私がこれに期待する正確な数字です。994 x 748 では 743,512 ピクセルになります。ピクセルあたり 2 バイトを使用する形式を使用していると仮定すると (これは画像の品質が非常に低く、FWIW - RGB565 形式は数十年前に国際的に禁止されているはずです)、画像あたり 1.481 MB になります。画像ファイルは圧縮されているため、これはもちろんディスク上の画像サイズよりもはるかに大きくなります。

これの Java バージョンが 105.5 MB しか消費しない理由がわかりません。私が知っているビットマップ形式で、1 ピクセルあたり 1.333 バイトを使用するものはありません。ほとんどの場合、メモリ使用量が間違っているか、Java ランタイムが一部の画像をメモリ内に保持する代わりにディスクにキャッシュしています。

于 2012-06-18T14:07:34.797 に答える
2

Mono for Android メーリング リストからの返信に基づく:

読み込んでいる画像はjpg圧縮されています。ビットマップは非圧縮形式です。少しグーグルで調べてみると、典型的な JPEG 圧縮率は 10:1 から 20:1 であり、顕著な画質を失うことはありませんでした。60KB -> 1MB がその範囲です。

そして別:

ビットマップをメモリにロードすると解凍され、ロードするビットマップ構成によっては、ディスク上の圧縮サイズよりも多くのメモリが消費されます。

圧縮に関するこの情報を見た後 (圧縮によってメモリ内のイメージが保存および読み込み用に小さくなり、メモリに解凍されることに気付いたので、頭の中で何が起こったのかわかりません)、物事がどのように機能するかがわかりました。 )ビットマップとして保存すると、画像はほぼ2MBに解凍されます-Irfanviewで画像のプロパティを見ると。

だから私が今やっていることは、サンプルサイズをに設定2してBitmap.Config.Rgb565. これにより、画像の合計サイズが約 30 MB に減少し、はるかに優れています。品質はそれほど良くありませんが、必要なときにユーザーが知らない高解像度の画像を読み込むことができます。

于 2012-06-18T13:56:57.540 に答える