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

Is this a correct way to get a bitmap's size before decoding it into memory?

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

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

但这都需要一个位图对象,这意味着我需要先将位图解码到内存中,这可能会导致 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 默认值。

这是正确的方法还是有更好的方法?

只需创建一个带有位图路径的文件对象。然后get file.length()得到文件大小。

例如文件位图 = 新文件 (pathToBitmap);

bitmap.length();

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

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

您可能无法 100% 可靠地防止位图解码上的 OOM,因为您无法保证一定数量的 连续 免费 space用于分配Bitmap的内存。但是你当然可以调整你的样本大小和配置来减少负载。