android - 如何减小透明位图大小(不是尺寸)

标签 android image-processing bitmap transparency out-of-memory

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

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

2)全帧(1000x700像素,背景透明,彩色边框,里面有很多文字)

两个位图的大小约为 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 的质量都是 Not Acceptable 。

对于处理具有大约 90% 的简单透明背景和 10% 的单色“数据”的图像的最佳方式,您还有其他想法吗?

最佳答案

无论您使用什么格式,在显示之前它总是以原始未压缩(解码)数据结束,如果不解码,您就无法在显示器上看到它。如果您担心内存不足,请尽量不要一直解码所有图像,只解码您必须显示的图像,并始终释放其他图像(不要保留对它们的引用)。

关于android - 如何减小透明位图大小(不是尺寸),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13308153/

相关文章:

matlab - 从圆和侵 eclipse 半径中移除突起

c++ - 我对找到图像中大多数线的交点感到震惊

java - 绘制基于图 block 的 map

c# - 从网络摄像头抓取图像时,使用 XNA 渲染位图很慢,为什么?

android - 如何在android中绘制位图?

android - 从 ListView 行中删除单个项目

android - 使用 Android Camera 进行图像处理

android - 我怎样才能在 TextView 中有一行分隔线

android - 如何像我们在 Android 应用程序中使用 Intent.ACTION_SEND 那样通过 iOS 应用程序中的其他应用程序共享内容/数据?

android - 无法更改 ImageView 的可见性