5

非常に大きな画像があり、ディスプレイのサイズ (スケーリングなし) のセクションのみを表示したいのですが、セクションは画像の中心にある必要があります。画像が非常に大きいため、画像全体をメモリに読み込んでトリミングすることはできません。これは私がこれまでに持っているものですが、大きな画像の場合は OutOfMemory が発生します。また、解像度を下げるのではなく、画像をトリミングしたいので、 inSampleSize は適用されないと思います。

Uri data = getIntent().getData();
InputStream is = getContentResolver().openInputStream(data);
Bitmap bitmap = BitmapFactory.decodeStream(is, null, null);

どんな助けでもいいですか?

4

3 に答える 3

2

これは 2 つの手順で行うことができます。

  1. inJustDecodeBounds=true を使用して、ビットマップのサイズを取得します。

  2. BitmapRegionDecoder を使用して、必要な部分だけをデコードします。

欠点は?API 10からのみ機能します(ただし、すでに大多数です...)。

于 2014-05-25T06:40:00.753 に答える
1

最も簡単な方法は、画像を多くの小さなタイル化された画像に分割し、適切な画像をロードして目的の画像を作成することであることに同意します。

ただし、そうしたくない場合は、jpeg 自体のエンコーディングを調べなければならない場合があります。

あなたができることは、ヘッダーをファイルから新しいファイルにコピーし、新しいファイルを作成するために必要なピクセルだけを抽出することです。次に、新しいファイルをリロードすると、作業対象の画像のサブセットだけを取得でき、通常のすべての Java 機能とクラスを同等に使用できるようになります。

必ずしもエレガントまたはシンプルなソリューションではないことは承知していますが、使用できると予想される元の Java 機能を使用できることが保証されます。

于 2010-07-30T02:29:45.773 に答える
0

あなたは間違った方向から問題に取り組んでいると思います。

ビットマップがすでに大きすぎて単一の連続画像としてロードできない場合、なぜそれを単一の画像として保存するのでしょうか? それをタイルにスライスしてから、中央のタイルをロードし、それらに基づいて行動します。

于 2010-07-22T14:26:50.290 に答える