Где черта Bitmap getByteCount ()?

Я знаю, что платформа 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() 

Solutions Collecting From Web of "Где черта Bitmap getByteCount ()?"

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

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

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

http://code.google.com/p/android-beryl/source/browse/beryl/src/org/beryl/app/AndroidVersion.java

 public static long getSizeInBytes(Bitmap bitmap) { if(AndroidVersion.isHoneycombMr2OrHigher()) { return bitmap.getByteCount(); } else { return bitmap.getRowBytes() * bitmap.getHeight(); } } 

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

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

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

Как упоминалось в других ответах, он доступен только по 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(); } } 

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

Я использовал 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(); 

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

Как вы можете видеть в исходном коде, getByteCount – это просто:

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

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