24

anddev.orgこの質問をしてくれたSchermvliegerに感謝します。

他のサイトで誰も答えなかったので、私は彼の質問をSOにコピーしているだけで、私も同じ問題に直面しています。

BitmapFactory.Options.inSampleSize画像の表示速度に関して、最適な使用法は何だろうと思っていました。
ドキュメントには、2 の累乗の値を使用することが記載されているため、2、4、8、16 などを使用しています。

私が疑問に思っていることは次のとおりです。

  1. 画面の解像度よりもまだ大きい最小サイズにリサンプリングする必要がありますか、それとも、エラーを回避するのに十分なサイズにサンプリングする必要がありOutOfMemoryErrorますか?
  2. メモリを使い果たすことなく表示できる画像の最大サイズを計算するにはどうすればよいでしょうか? 画像の色深度やディスプレイの深度も影響しますか?
  3. 2つのメカニズム(BitmapFactory大きなファイルsetImageURI()用、小さなファイル用)を介して画像を表示するのは効率的ですか?ImageSwitcherちなみに使用しています。
  4. とをアプリケーションの最初に作成したり、必要なときにその場でのみ作成したりするのBitmapに役立ちますか?BitmapFactory.OptionsinTempStorage
4

4 に答える 4

12

画像が最終的に表示されるサイズにできるだけ近くなるように、常に画像を読み込んで事前にスケーリングするようにしてください。描画時の画像のスケーリングは非常にコストがかかるため、絶対に避けるべきです。

画像のメモリ コストを考慮すると、色深度は非常に重要な役割を果たします。ALPHA_8 形式の画像はピクセルあたり 1 バイトを使用し、RGB_565 または ARGB_4444 の画像はピクセルあたり 2 バイトを使用し、ARGB_8888 の画像はピクセルあたり 4 バイトを使用します。ディスプレイの奥行きはまったく問題ありません。可能な限り最高の品質を得るには、常に ARGB_8888 を使用するようにしてください。ただし、画像が不透明な場合は 565 で十分です。

于 2011-02-18T09:22:40.277 に答える
4

良い質問をしてきましたが、それはすべて、ニーズと使用するメモリの量によって異なります。ビットマップに関する多くのヒントについては、このリンクをチェックすることをお勧めします: http://developer.android.com/training/displaying-bitmaps/index.html

要するに、キャッシング、ダウンサンプリング、および十分なビットマップ形式の使用を可能な限り検討する必要があります。

あなたの質問に対する私の答えは次のとおりです。

  1. なぜ両方ではない?OOM があると思われる場合は、古い未使用のビットマップをリサイクルしてから、もう一度確認してください。

  2. ビットマップの(推定)サイズを計算できます:

    幅*高さ*ピクセルあたりのバイト数

    ここで、bytesPerPixel は通常 4 または 2 です (ビットマップ形式によって異なります)。

  3. setImageURI を使用したことがないので、それについてはお手伝いできません。バックグラウンド スレッドで画像をダウンロードし (asyncTask を使用するのも 1 つの方法です)、準備ができたら表示することをお勧めします。

  4. 多くのメモリを必要としないことがわかっているものがわずかしかない場合は、問題ないと思います。私はまだキャッシングの方が良いと思います。

于 2013-02-09T12:13:08.117 に答える
3

shrinkmehtodここでは、文字列ファイルのパスと高さと幅を実際に送信するユーザー定義のメソッドを呼び出して、画像をメソッドに縮小できます。

 Bitmap bit=shrinkmethod(arrpath1[position], 100, 100);


            //iv.setImageURI(Uri.parse(arrpath1[position]));
            iv.setImageBitmap(bit);

これは、プログラムで画像のサイズを縮小するためのユーザー定義の方法です。

Bitmap shrinkmethod(String file,int width,int height){
        BitmapFactory.Options bitopt=new BitmapFactory.Options();
        bitopt.inJustDecodeBounds=true;
        Bitmap bit=BitmapFactory.decodeFile(file, bitopt);

        int h=(int) Math.ceil(bitopt.outHeight/(float)height);
        int w=(int) Math.ceil(bitopt.outWidth/(float)width);

        if(h>1 || w>1){
            if(h>w){
                bitopt.inSampleSize=h;

            }else{
                bitopt.inSampleSize=w;
            }
        }
        bitopt.inJustDecodeBounds=false;
        bit=BitmapFactory.decodeFile(file, bitopt);



        return bit;

    }

これがサイズの縮小に役立つことを願っています。

于 2012-03-06T06:46:17.173 に答える