Растровый размер байта после декодирования?
Как я могу определить / вычислить размер байта растрового изображения (после декодирования с помощью BitmapFactory)? Мне нужно знать, сколько места в памяти он занимает, потому что я делаю кэширование памяти/управление в моем приложении. (размер файла не достаточно, так как это файлы jpg / png)
Спасибо за любые решения!
обновление: getRowBytes * getHeight может сделать трюк.. Я буду реализовывать его таким образом, пока кто-то не придумает что-то против него.
4 ответа:
getRowBytes() * getHeight()
Кажется, работает нормально для меня.обновление до моего ~2-летнего ответа: Поскольку растровое изображение уровня API 12 имеет прямой способ запросить размер байта: http://developer.android.com/reference/android/graphics/Bitmap.html#getByteCount%28%29
----пример кода
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) protected int sizeOf(Bitmap data) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) { return data.getRowBytes() * data.getHeight(); } else { return data.getByteCount(); } }
лучше всего просто использовать библиотеку поддержки:
int bitmapByteCount=BitmapCompat.getAllocationByteCount(bitmap)
вот версия 2014 года, которая использует KitKat в
getAllocationByteCount()
и пишется так, что компилятор понимает логику версии (так@TargetApi
не требуется)/** * returns the bytesize of the give bitmap */ public static int byteSizeOf(Bitmap bitmap) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { return bitmap.getAllocationByteCount(); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) { return bitmap.getByteCount(); } else { return bitmap.getRowBytes() * bitmap.getHeight(); } }
обратите внимание, что в результате
getAllocationByteCount()
можете быть больше, чем результатgetByteCount()
если битовая карта используется для декодирования других растровых изображений меньшего размера, или по ручной настройке.
public static int sizeOf(Bitmap data) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) { return data.getRowBytes() * data.getHeight(); } else if (Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT){ return data.getByteCount(); } else{ return data.getAllocationByteCount(); } }
единственная разница с ответом @user289463 - это использование
getAllocationByteCount()
для KitKat и выше версий.