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

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

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

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

Ответ 1

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();
        }
    }

Ответ 2

Лучше всего использовать библиотеку поддержки:

int bitmapByteCount=BitmapCompat.getAllocationByteCount(bitmap)

Ответ 3

Вот версия 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(), если растровое изображение повторно используется для декодирования других растровых изображений меньшего размера или путем ручной реконфигурации.

Ответ 4

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