这是在将位图解码到内存之前获取位图大小的正确方法吗?
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的内存。但是你当然可以调整你的样本大小和配置来减少负载。
我知道我可以使用这些方法来获取位图的大小:
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的内存。但是你当然可以调整你的样本大小和配置来减少负载。