4

キャンバスにスケーリングされたビットマップをペイントしたい(ビットマップとビューサイズに基づく)。問題は、ビットマップをペイントする前にキャンバスを拡大縮小すると、次のようになることです。

 canvas.scale(1.5f,1.5f);
 canvas.drawBitmap(mBitmap, 0, 0, paint);

結果は次のとおりです。

エイリアス画像

しかし、キャンバスをスケーリングする代わりに、ビットマップをスケーリングする場合は、次のようになります。

Bitmap scaled = Bitmap.createScaledBitmap(
        mBitmap, bitmapWidth, bitmapHeight,
        true);
canvas.drawBitmap(scaledBitmap, 0, 0, paint);

結果ははるかに優れています: 正しく拡大縮小された画像

問題は、ビットマップがかなり大きく、元のビットマップとスケーリングされたビットマップの両方をメモリに保持すると問題が発生する可能性があることです。

ビットマップまたはビューの境界が変更されるたびにスケーリングされたビットマップを作成せずに2番目の結果を取得する方法はありますか?

4

3 に答える 3

1

キャンバスに描画するときは、スケーリング情報を含むマトリックスを使用してください

canvas.drawBitmap(x,y,..., matrix...)
于 2013-01-10T07:41:33.540 に答える
1

ソースからビットマップを読み取るときに使用inSampleSizeして、それに応じてスケーリングします (追加のパラメーターとして渡されます)。BitmapOptions

これは、完全なイメージがメモリにロードされることはないため、ほぼすべての場合にメモリ オーバーフローを回避するためにイメージをロードする Android の推奨方法です。

ビットマップの効率的なロードに関する Android ドキュメントは、こちらにあります。

ソースから目的のサイズの画像を取得する方法のコード例を示します。(リソース、ファイルなど)

の 2 つの方法Loading Large Bitmaps Efficientlyは、探しているものです。

于 2013-01-10T07:45:00.050 に答える
1

私の問題の解決策は、ペイントが FILTER_BITMAP_FLAG フラグを有効にしていないことでした。

于 2013-01-10T09:37:26.310 に答える