首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何减小透明位图大小(而不是尺寸)

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

Stack Overflow用户
提问于 2012-11-09 12:32:46
回答 1查看 1.2K关注 0票数 3

在我的安卓应用程序中,我正在制作画布位图(实际上它是三星的SCanvas SPen SDK,但这并不重要),因为这类位图的90%-95%的区域是透明的,所以我预计KB的位图大小不会太大。但是,看起来位图大小( KB)并不取决于它是简单的背景还是复杂的图片,因此,例如,如果我有两个图像(对不起,我是一个新用户,我不能发布任何图像):

1)空框(1000 x 700 px,背景透明,颜色边框)

2)全帧(1000x700 px,背景透明,彩色边框,大量文本在里面)

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

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

我必须将许多这样的图像存储在DB中,并以ImageView位图的形式显示它们。

问题1:如果我需要显示具有95%透明图像的20个ImageView对象,有没有办法不同时使用20 * 1.3MB?在我看来,应该只有一个alpha层+20个“数据”层。

问题2:有没有办法在不损失太多质量的情况下减少图像的大小(以KB为单位)?我看到的唯一方法是用inSampleSize =2解码图像字节数组,然后创建一个缩放的位图以保持原始图像维数,如下所示:

代码语言:javascript
复制
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);

但是finalBitmap的质量是不可接受的,不管我使用了什么选项(inPreferredConfig,inDither)。

有没有其他的想法来处理图像的最佳方式与约90%的简单透明背景和10%的单色“数据”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-09 12:55:32

无论您使用何种格式,在显示之前,它总是以原始未压缩(解码)数据的形式结束,如果没有解码,就无法在显示中看到它。如果你担心内存问题,试着不要让所有的图像都被解码,只需要解码你必须显示的图像,并且总是释放其他的图像(不要引用它们)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13308153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档