在我的安卓应用程序中,我正在处理画布位图(实际上是三星SPen SDK中的SCanvas,但这并不重要)。通常,这些位图的90-95%区域是透明的,因此我预计其文件大小不会太大。但似乎位图的文件大小(以KB为单位)与其是简单背景还是复杂图片无关,例如,如果我有两个图像:
1)空框架(1000x700像素,背景透明,颜色边框)
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),最终位图的质量都是不可接受的。
对于大约90%具有简单透明背景和10%单色“数据”的图片,您有没有其他处理方式的想法?
BitmapDrawable bitmapDrawable = new BitmapDrawable(originalBitmap); imageView.setImageDrawable(bitmapDrawable);
- Mohammad Ersan