【发布时间】:2012-10-29 18:39:48
【问题描述】:
在我的 android 应用程序中,我正在处理画布位图(实际上它是来自三星 SPen SDK 的 SCanvas,但没关系),通常此类位图的 90-95% 区域是透明的,所以我希望有以 KB 为单位的位图大小不要太大。但似乎位图大小(以 KB 为单位)并不取决于它是简单的背景还是复杂的图片,所以例如,如果我有两张图片(对不起,我是新用户,我不能发布任何图片):
1) 空框(1000x700 px,背景透明,彩色边框)
2) 全画幅(1000x700 px,背景透明,彩色边框,里面有很多文字)
两个位图的大小约为 1.3MB。
但是如果我将这些位图转换成字节数组,第一个数组的大小大约是第二个数组大小的 11 倍。
我必须将很多这样的图像作为 BLOB 存储在 DB 中,并将它们显示为 ImageView 位图。
问题1:如果我需要显示20个ImageView对象,这样95%的透明图像,有什么办法不同时使用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% 的单色“数据”的图像的最佳方式有什么想法吗?
【问题讨论】:
-
如果你使用 ImageView,你必须使用 Drawable 而不是 Bitmap。
-
如果您使用资源,我会说这是更方便的方式。如果是字节数组,有什么好处? stackoverflow.com/a/7045044/1811746
-
使用此代码将位图转换为可绘制对象。
BitmapDrawable bitmapDrawable=new BitmapDrawable(orginalBitmap); imageView.setImageDrawable(bitmapDrawable); -
考虑将它们一个一个打开,然后绘制到主位图上。所以只有2个图像同时加载到内存中。 p.s.尽可能保持样本大小。
标签: android image-processing bitmap transparency out-of-memory