3

在我的 android 应用程序中,我正在处理画布位图(实际上它是来自三星 SPen SDK 的 SCanvas,但没关系),通常这种位图的 90-95% 区域是透明的,所以我希望不会太大位图大小(KB)。但似乎位图大小(以 KB 为单位)并不取决于它是简单的背景还是复杂的图片,例如,如果我有两张图片(对不起,我是新用户,我不能发布任何图片):

1)空框(1000x700 px,背景透明,彩色边框)

2)全画幅(1000x700 px,背景透明,彩色边框,里面有很多文字)

两个位图的大小约为 1.3MB。

但是如果我将这些位图转换为字节数组,第一个数组的大小大约是第二个数组大小的 11 倍。

我必须在数据库中存储很多这样的图像作为 BLOB 并将它们显示为 ImageView 位图。

问题 1:如果我需要显示 20 个具有 95% 透明图像的 ImageView 对象,有没有办法不同时使用 20 * 1.3MB?对我来说,它似乎应该只有 1 个 alpha 层 + 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 回答