Android:API中的bitmap.getByteCount()小于12

时间:2012-09-25 10:44:29

标签: android getimagesize

当我在将图像保存到SD卡之前搜索如何查找图像的尺寸时,我发现了这个:

bitmap.getByteCount();

但是这个方法是在API 12中添加的,我使用的是API 10.所以我再次发现了这个:

getByteCount()只是一种方便的方法,可以完全放在else-block中。换句话说,如果您只是重写getSizeInBytes以始终返回“bitmap.getRowBytes()* bitmap.getHeight()”

这里:

Where the heck is Bitmap getByteCount()?

因此,通过计算此bitmap.getRowBytes() * bitmap.getHeight(),我得到了值120000 (117 KB)

其中SD卡上的图像尺寸为1.6 KB

我缺少什么?或做错了?

谢谢

7 个答案:

答案 0 :(得分:32)

你正确地做到了!

确定值是否有效的快速方法是将其记录如下:

int numBytesByRow = bitmap.getRowBytes() * bitmap.getHeight();
int numBytesByCount = bitmap.getByteCount();
Log.v( TAG, "numBytesByRow=" + numBytesByRow ); 
Log.v( TAG, "numBytesByCount=" + numBytesByCount ); 

这给出了结果:

03-29 17:31:10.493: V/ImageCache(19704): numBytesByRow=270000
03-29 17:31:10.493: V/ImageCache(19704): numBytesByCount=270000

所以两者都在计算相同的数字,我怀疑是位图的内存大小。这与 JPG PNG <不同/ strong>在磁盘上,因为它完全未压缩。


有关详细信息,我们可以查看示例项目中的AOSP和源代码。这是Android开发人员文档 Caching Bitmaps

中示例项目 BitmapFun 中使用的文件

AOSP ImageCache.java

/**
 * Get the size in bytes of a bitmap in a BitmapDrawable.
 * @param value
 * @return size in bytes
 */
@TargetApi(12)
public static int getBitmapSize(BitmapDrawable value) {
    Bitmap bitmap = value.getBitmap();

    if (APIUtil.hasHoneycombMR1()) {
        return bitmap.getByteCount();
    }
    // Pre HC-MR1
    return bitmap.getRowBytes() * bitmap.getHeight();
}

正如您所看到的,这与他们使用的技术相同

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

参考文献:

答案 1 :(得分:5)

现在我正在使用它:

ByteArrayOutputStream bao = new ByteArrayOutputStream();
my_bitmap.compress(Bitmap.CompressFormat.PNG, 100, bao);
byte[] ba = bao.toByteArray();
int size = ba.length;

将总字节数作为大小。因为我在这里获得的值完全匹配SD卡上图像的大小(以字节为单位)。

答案 2 :(得分:2)

没有什么遗漏!您的codesnippet显示了Android-Source的实现:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/graphics/Bitmap.java#Bitmap.getByteCount%28%29

我认为尺寸的差异是图像压缩的结果(jpg等)。

答案 3 :(得分:2)

这是另一种方式:

public static int getBitmapByteCount(Bitmap bitmap) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1)
        return bitmap.getRowBytes() * bitmap.getHeight();
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
        return bitmap.getByteCount();
    return bitmap.getAllocationByteCount();
}

IDE的getAllocationByteCount()声明:

  

如果是位图,这可能比getByteCount()的结果大   重用以解码较小尺寸的其他位图,或手动解码   重新配置。请参阅reconfigure(int,int,Bitmap.Config),   setWidth(int),setHeight(int),setConfig(Bitmap.Config)和   BitmapFactory.Options.inBitmap。如果未在此修改位图   方式,此值将与getByteCount()返回的值相同。

答案 4 :(得分:1)

你可以试试这段代码

int pixels = bitmap.getHeight() * bitmap.getWidth();
int bytesPerPixel = 0;
switch(bitmap.getConfig()) {
case ARGB_8888:
bytesPerPixel = 4;
break;
case RGB_565:
bytesPerPixel = 2; 
 break;
case ARGB_4444:
bytesPerPixel = 2; 
 break;
case ALPHA_8 :
 bytesPerPixel = 1; 
 break;
}
 int byteCount = pixels / bytesPerPixel;

答案 5 :(得分:0)

SD卡上的图像有不同的大小,因为它是压缩的。在设备上它将取决于宽度/高度

答案 6 :(得分:0)

为什么不尝试在1024之间划分?获取KB而不是字节。