这是在将位图解码到内存之前获取位图大小的正确方法吗?

时间:2016-03-31 04:24:40

标签: android bitmap bitmapfactory

我知道我可以用这些方法来获取Bitmap的大小:

bitmap.getAllocationByteCount();              //API 19
bitmap.getByteCount();                        //API 12
bitmap.getRowBytes() * bitmap.getHeight();    //earlier version

但是这一切都需要一个Bitmap对象,这意味着我需要先将位图解码到内存中,这可能是OOM例外情况。所以我在获取Bitmap对象之前使用这种方式来获取大小:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(bitmapPath, options);
int picWidth = options.outWidth;
int picHeight = options.outHeight;
int size = 4 * picHeight * picWidth;    //Byte

我认为它的每像素成本为32位,因为Android解码位图使用RGB_8888默认值。

这是正确的方法还是有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用BitmapFactory.Options.inPreferredConfig选择位图配置。这将允许您指定一个配置,您可以确定Bitmap将占用每个像素的字节数。我相信RGB_8888是默认值。

您可能无法100%可靠地阻止位图解码上的OOM,因为您无法保证内存中的一定量连续可用空间用于分配位图。但您当然可以调整样本大小和配置以减少负载。

答案 1 :(得分:-1)

只需使用Bitmap的路径创建一个File对象。然后获取file.length()以获取文件大小。

e.g。文件位图=新文件(pathToBitmap);

bitmap.length();

您必须根据需要添加try / catch子句。