3

私のAndroidアプリケーションでは、キャンバスビットマップに取り組んでいます(実際にはSamsung SPen SDKのSCanvasですが、問題ではありません)。原則として、そのようなビットマップの領域の90〜95%は透明であるため、大きすぎないことが期待されましたKB 単位のビットマップ サイズ。しかし、ビットマップ サイズ (KB 単位) は、単純な背景か複雑な画像かに依存しないようです。たとえば、2 つの画像がある場合 (申し訳ありませんが、私は新しいユーザーであり、画像を投稿できません):

1) 空のフレーム (1000x700 px、背景は透明、色枠)

2) フルフレーム (1000x700 px、背景は透明、色付きの境界線、内部に多くのテキスト)

両方のビットマップのサイズは約 1.3MB です。

しかし、これらのビットマップをバイト配列に変換すると、最初の配列のサイズは 2 番目の配列のサイズの約 11 分の 1 になります。

このような画像を BLOB として DB に大量に保存し、それらを ImageView ビットマップとして表示する必要があります。

質問 1 : 20 個の ImageView オブジェクトを 95% の透明度の画像で表示する必要がある場合、同時に 20 * 1.3MB を使用しないようにする方法はありますか? 私には、1つのアルファレイヤー+ 20の「データ」レイヤーだけであるように思えます。

質問 2 : 品質をあまり落とさずに透明度のある画像のサイズ (KB 単位) を縮小する方法はありますか? 私が見た唯一の方法は、inSampleSize = 2 で画像バイト配列をデコードし、元の画像のサイズを維持するためにスケーリングされたビットマップを作成することです。

originalBitmap.compress(Bitmap.CompressFormat.PNG, 0, stream);
byte[] bitmapBytes = stream.toByteArray();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length, options);
int bWidth = options.outWidth;
int bHeight = options.outHeight;
options.inSampleSize = 2;
options.inPreferredConfig = Bitmap.Config.ARGB_4444;
options.inJustDecodeBounds = false;
Bitmap scaledBitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length, options);
Bitmap finalBitmap = Bitmap.createScaledBitmap(scaledBitmap, bWidth, bHeight, true);

しかし、使用したオプション (inPreferredConfig、inDither) に関係なく、finalBitmap の品質は受け入れられません。

シンプルな透明背景が約 90%、単色の「データ」が 10% の画像を処理する最適な方法について、他に何か考えはありますか?

4

1 に答える 1

1

使用する形式に関係なく、表示する前に常に生の非圧縮 (デコード) データになります。デコードされていない場合は、ディスプレイに表示されません。メモリが心配な場合は、常にすべての画像をデコードするのではなく、表示する必要がある画像のみをデコードし、他の画像は常に解放してください (それらへの参照を保持しないでください)。

于 2012-11-09T12:55:32.930 に答える