2013-03-10 5 views
7

私はAndroidアプリケーションを作成しています。私は画像をビットマップにロードし、「ピンチズーム」ジェスチャを使用してサイズを変更する必要があります。ただし、イメージが一定のサイズを超えると、アプリケーションがクラッシュします(OutOfMemory例外)。イメージのロードと操作を最適化するにはどうすればよいですか? 大きなビットマップのAndroidローディング

は、私が使用して画像を読み込むには:

BitmapFactory.decodeResource (ctx.getResources(), R.drawable.image) 

がそれを描画するには:

imgCanvas.drawBitmap (image, posX, posY, null), 

は、そのサイズを変更するには:

Bitmap.createScaledBitmap (originalBitmap, neww, NEWH, true); 

答えて

3

これは簡単ではありません。

画像と画像の現在可視部分の現在の規模に基づいて、唯一の適切な解像度でその画像の一部をロード:
https://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html

ズームアウトして表示したいです画像全体がBitmapFactory.Optionsパラメータを取り、1(2のべき乗であることが好ましい値)よりも大きい値にそれをinSampleSize設定このBitmapRegionDecoderクラスからメソッドを使用して、ダウンスケーリングされた:
https://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

にズーミングするとき、最初にズームインする既に表示されている低解像度(inSampleSize> 1の値を使用した場合)と、より高い解像度のバージョン(inSampleSizeが使用していた以前の値よりも小さい場合)をゆっくりと読み込み、徐々に高解像度バージョンをフェードインさせます。

ユーザーがズームイン、あなたのinSampleSizeは、私が最初に(= 1 inSampleSizeで)元のサイズで画像を読み込む1.

+0

になるまでこれをやり続けます。 「ズームイン」を行うと、inSampleSizeを値> 1に変更してから画像をトリミングする必要がありますか? – Giammy

+0

ユーザがズームインする前に、画像全体をinSampleSize> 1でロードします。次に、あるポイントでズームインすると、画像の一部だけが読み込まれ、値が小さいinSampleSizeまだ1以上)。ユーザーが何度も何度もズームすると、inSampleSize = 1(そして、表示されている部分だけが読み込まれます)。 –

関連する問題