Подтвердить что ты не робот

Android: bitmap.getByteCount() в API меньше 12

Когда я искал, как найти размер изображения, прежде чем сохранять его на SD-карте, я нашел это:

bitmap.getByteCount();

но этот метод добавлен в API 12, и я использую API 10. Так что снова я узнал об этом:

getByteCount() - это просто удобный метод, который делает именно то, что вы разместили в else-блоке. Другими словами, если вы просто переписываете getSizeInBytes, чтобы всегда возвращать "bitmap.getRowBytes() * bitmap.getHeight()"

здесь:

Где находится битмап getByteCount()?

поэтому, вычислив это bitmap.getRowBytes() * bitmap.getHeight(), я получил значение 120000 (117 KB).

когда размер изображения на SD-карте равен 1.6 KB.

Что мне не хватает? или делать неправильно?

Спасибо

4b9b3361

Ответ 1

Вы делаете это правильно!

Быстрый способ узнать, действительно ли значения действительны, заключается в том, чтобы записывать его следующим образом:

int numBytesByRow = bitmap.getRowBytes() * bitmap.getHeight();
int numBytesByCount = bitmap.getByteCount();
Log.v( TAG, "numBytesByRow=" + numBytesByRow ); 
Log.v( TAG, "numBytesByCount=" + numBytesByCount ); 

Это дает результат:

03-29 17:31:10.493: V/ImageCache(19704): numBytesByRow=270000
03-29 17:31:10.493: V/ImageCache(19704): numBytesByCount=270000

Итак, оба вычисляют одинаковое число, которое, как я подозреваю, является размером в памяти. Растровое изображение.. Это отличается от JPG или PNG на диске, так как он полностью несжатый.


Для получения дополнительной информации мы можем посмотреть на AOSP и источник в примере проекта. Это файл, используемый в примере проекта BitmapFun в документах разработчика Android Кэширование битовых карт

AOSP ImageCache.java

/**
 * Get the size in bytes of a bitmap in a BitmapDrawable.
 * @param value
 * @return size in bytes
 */
@TargetApi(12)
public static int getBitmapSize(BitmapDrawable value) {
    Bitmap bitmap = value.getBitmap();

    if (APIUtil.hasHoneycombMR1()) {
        return bitmap.getByteCount();
    }
    // Pre HC-MR1
    return bitmap.getRowBytes() * bitmap.getHeight();
}

Как вы можете видеть, это тот же метод, который они используют

bitmap.getRowBytes() * bitmap.getHeight();

Литература:

Ответ 2

Теперь я использую это:

ByteArrayOutputStream bao = new ByteArrayOutputStream();
my_bitmap.compress(Bitmap.CompressFormat.PNG, 100, bao);
byte[] ba = bao.toByteArray();
int size = ba.length;

чтобы получить общее количество байтов как размер. Поскольку значение, которое я получаю здесь, отлично соответствует размеру (в байтах) изображения на SD-карте.

Ответ 4

Вот альтернативный способ:

public static int getBitmapByteCount(Bitmap bitmap) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1)
        return bitmap.getRowBytes() * bitmap.getHeight();
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
        return bitmap.getByteCount();
    return bitmap.getAllocationByteCount();
}

Заявление из IDE для getAllocationByteCount():

Это может быть больше результата getByteCount(), если растровое изображение повторно использовать для декодирования других растровых изображений меньшего размера или вручную реконфигурации. См. Reconfigure (int, int, Bitmap.Config), setWidth (int), setHeight (int), setConfig (Bitmap.Config) и BitmapFactory.Options.inBitmap. Если растровое изображение не изменяется в этом путь, это значение будет таким же, как и возвращаемое getByteCount().

Ответ 5

может вы можете попробовать этот код

int pixels = bitmap.getHeight() * bitmap.getWidth();
int bytesPerPixel = 0;
switch(bitmap.getConfig()) {
case ARGB_8888:
bytesPerPixel = 4;
break;
case RGB_565:
bytesPerPixel = 2; 
 break;
case ARGB_4444:
bytesPerPixel = 2; 
 break;
case ALPHA_8 :
 bytesPerPixel = 1; 
 break;
}
 int byteCount = pixels / bytesPerPixel;

Ответ 6

изображение на SD-карте имеет другой размер, потому что сжато. на устройстве это будет зависеть от ширины/высоты

Ответ 7

Почему бы вам не попробовать делить его между 1024? Чтобы получить KB вместо байтов.