Растровый размер байта после декодирования?


Как я могу определить / вычислить размер байта растрового изображения (после декодирования с помощью BitmapFactory)? Мне нужно знать, сколько места в памяти он занимает, потому что я делаю кэширование памяти/управление в моем приложении. (размер файла не достаточно, так как это файлы jpg / png)

Спасибо за любые решения!

обновление: getRowBytes * getHeight может сделать трюк.. Я буду реализовывать его таким образом, пока кто-то не придумает что-то против него.

4 57

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 и выше версий.