Где, черт возьми, Bitmap getByteCount ()? - PullRequest
10 голосов
/ 21 июня 2011

Я знаю, что платформа Android - это огромный беспорядок, слишком сложный и чрезмерно сложный, но если серьезно, чтобы получить размер растрового изображения, действительно ли необходимо делать все эти преобразования?

Bitmap bitmap = your bitmap object
ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] imageInByte = stream.toByteArray();
long length = imageInByte.length;

Согласнов Google Документация Bitmap имеет метод getByteCount () , чтобы сделать это, однако он отсутствует в SDK2.2, не пробовал другие, но нет упоминаний о том, что он устарел, или что поддержка API является какой-либоотличается от API 1 ... Так где же скрывается этот загадочный метод?Было бы здорово, если бы ты просто сделал

bitmap.getByteCount()

Ответы [ 7 ]

61 голосов
/ 26 июля 2011

Я только что написал этот метод.AndroidVersion.java - это класс, который я создал, чтобы легко получить мне код версии с телефона.

12 голосов
/ 21 июня 2011

Если вы отфильтруете по API Level 8 (= SDK 2.2), вы увидите, что Bitmap#getByteCount() отображается серым цветом, то есть метод отсутствует на этом уровне API.

getByteCount() было добавлено в API уровня 12.

3 голосов
/ 29 июля 2015

Ответы здесь немного устарели. Причина (в документах ):

getByteCount: Начиная с KITKAT, результат этого метода больше не может использоваться для определения использования памяти растрового изображения. Увидеть getAllocationByteCount ().

Итак, текущий ответ должен быть:

int result = BitmapCompat.getAllocationByteCount (bitmap)

или, если вы настаиваете на том, чтобы написать это самостоятельно:

public static int getBitmapByteCount(Bitmap bitmap) {
    if (VERSION.SDK_INT < VERSION_CODES.HONEYCOMB_MR1)
        return bitmap.getRowBytes() * bitmap.getHeight();
    if (VERSION.SDK_INT < VERSION_CODES.KITKAT)
        return bitmap.getByteCount();
    return bitmap.getAllocationByteCount();
}
1 голос
/ 06 апреля 2013

Как уже упоминалось в других ответах, он доступен только для API 12 или выше. Это простая версия совместимости метода.

public static int getByteCount(Bitmap bitmap) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) {
        return bitmap.getRowBytes() * bitmap.getHeight();
    } else {
        return bitmap.getByteCount();
    }
}
1 голос
/ 09 августа 2012

До API 12 вы можете вычислить размер байта растрового изображения, используя getHeight () * getWidth () * 4 , если вы используете ARGB_8888, поскольку каждый пиксель хранится в 4 байтах.Я думаю, что это формат по умолчанию.

0 голосов
/ 07 июля 2015

Как видно из исходного кода, getByteCount просто так:

public final int getByteCount() {
    // int result permits bitmaps up to 46,340 x 46,340
    return getRowBytes() * getHeight();
}

Вот исходный код для 5.0

0 голосов
/ 07 июня 2013

Я перепробовал все вышеперечисленные методы, и они были близки, но не совсем правильно (по крайней мере, для моей ситуации).

Я использовал bitmap.getByteCount (); внутри метода sizeOf () при создании нового LruCache:

mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
    @Override
    protected int sizeOf(String key, Bitmap bitmap) {
        return bitmap.getByteCount();
    }
};  

Затем я попробовал предложенное:

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

Это было здорово, но я заметил, что возвращаемые значения были другими, и когда я использовал приведенное выше предложение, он даже не создал кеш на моем устройстве. Я проверил возвращаемые значения на Nexus One под управлением api 3.2 и Galaxy Nexus под управлением 4.2:

bitmap.getByteCount(); returned-> 15  
bitmap.getRowBytes() * bitmap.getHeight(); returned-> 15400

Итак, чтобы решить мою проблему, я просто сделал это:

return (bitmap.getRowBytes() * bitmap.getHeight()) / 1000; 

вместо:

return bitmap.getByteCount();  

Может быть, вы не в такой ситуации, но у меня это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...