Where the heck is Bitmap getByteCount()?

后端 未结 7 2005
时光取名叫无心
时光取名叫无心 2021-01-02 05:46

I know the Android platform is a huge mess, over complicated and over-engineered, but seriously to get the size of a bitmap, is it really necessary to do all those conversio

相关标签:
7条回答
  • 2021-01-02 05:51

    As mentioned in other answers, it is only available on API 12 or higher. This is a simple compatibility version of the method.

    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();
        }
    }
    
    0 讨论(0)
  • 2021-01-02 05:58

    If you filter by API Level 8 (= SDK 2.2), you'll see that Bitmap#getByteCount() is greyed out, meaning that method is not present in that API level.

    getByteCount() was added in API Level 12.

    0 讨论(0)
  • 2021-01-02 05:58

    I just wrote this method. AndroidVersion.java is a class I created to easily get me the version code from the phone.

    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();
        }
    }
    
    0 讨论(0)
  • 2021-01-02 06:01

    I tried all of the above methods and they were close, but not quite right (for my situation at least).

    I was using bitmap.getByteCount(); inside of the sizeOf() method when creating a new LruCache:

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

    I then tried the suggested:

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

    This was great, but I noticed that the returned values were different and when I used the suggestion above, it would not even make a cache on my device. I tested the return values on a Nexus One running api 3.2 and a Galaxy Nexus running 4.2:

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

    So to solve my issue, I simply did this:

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

    instead of:

    return bitmap.getByteCount();  
    

    May not be the same situation you were in, but this worked for me.

    0 讨论(0)
  • 2021-01-02 06:01

    As you can see in the source code, getByteCount is simply this:

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

    Here is the source code for 5.0

    0 讨论(0)
  • 2021-01-02 06:03

    Before API 12 you can calculate the byte size of an Bitmap using getHeight() * getWidth() * 4 if you are using ARGB_8888 because every pixel is stored in 4bytes. I think this is the default format.

    0 讨论(0)
提交回复
热议问题