我知道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()
答案 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级别中不存在该方法。
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();
}