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

时间:2012-11-09 12:32:47

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

在我的android应用程序中,我正在使用canvas bitmaps(实际上它是来自Samsung SPen SDK的SCanvas,但没关系),因为这种位图的90-95%面积是透明的,所以我希望有不是太大的位图大小(KB)。但似乎位图大小(以KB为单位)并不依赖于它是简单的背景还是复杂的图片,例如,如果我有两个图像(抱歉,我是新用户,我无法发布任何图像):< / p>

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

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

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

但如果我在字节数组中转换这些位图,则第一个数组的大小比第二个数组的大小小11倍。

我必须将大量此类图像作为BLOB存储在DB中,并将它们显示为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%的单色“数据”处理图像的最佳方式还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

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