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



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

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

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

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。

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

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

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

只需创建一个带有位图路径的File对象。然后获取file.length()以获取文件大小。

例如File bitmap=new File(pathToBitmap);

bitmap.length();

你必须根据需要加入try/catch子句。

最新更新