Битовый размер растрового изображения после декодирования? - PullRequest
61 голосов
/ 09 марта 2010

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

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

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

Ответы [ 4 ]

113 голосов
/ 09 марта 2010

getRowBytes() * getHeight() мне кажется, работает нормально.

Обновление до моего ~ 2-летнего ответа: Поскольку API уровня 12 Bitmap имеет прямой способ запроса размера байта: 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();
        }
    }
41 голосов
/ 29 июля 2015

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

int bitmapByteCount=BitmapCompat.getAllocationByteCount(bitmap)

Но если у вас есть проект Android для использования не менее minSdk из 19 (kitkat, что означает 4.4), вы можете просто использовать bitmap.getAllocationByteCount () .

21 голосов
/ 30 мая 2014

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

5 голосов
/ 10 января 2015
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 и более поздних версий.

...