哪里有位图getByteCount()?

时间:2011-06-21 15:47:39

标签: android methods

我知道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 个答案:

答案 0 :(得分:61)

我刚写了这个方法。 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();
    }
}

答案 1 :(得分:12)

如果按API级别8(= SDK 2.2)进行过滤,您会看到Bitmap#getByteCount()显示为灰色,表示该API级别中不存在该方法。

API级别12中添加了

getByteCount()

答案 2 :(得分:3)

这里的答案有点过时了。原因(在docs中):

  

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

答案 3 :(得分:1)

在API 12之前,如果使用ARGB_8888,则可以使用 getHeight()* getWidth()* 4 计算位图的字节大小,因为每个像素都以4字节存储。我认为这是默认格式。

答案 4 :(得分:1)

如其他答案中所述,它仅适用于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();
    }
}

答案 5 :(得分:0)

我尝试了上述所有方法并且它们很接近,但不是很正确(至少对我的情况而言)。

我使用的是bitmap.getByteCount();创建新的LruCache时,在sizeOf()方法内部:

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

然后我尝试了建议:

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

这很棒,但我注意到返回的值不同,当我使用上面的建议时,它甚至不会在我的设备上创建缓存。我测试了运行api 3.2的Nexus One和运行4.2的Galaxy Nexus的返回值:

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

所以为了解决我的问题,我只是这样做了:

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

而不是:

return bitmap.getByteCount();  

可能与你所处的情况不一样,但这对我有用。

答案 6 :(得分:0)

正如您在源代码中看到的那样,getByteCount就是这样:

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