私の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% の画像を処理する最適な方法について、他に何か考えはありますか?