Android:bitmap.getByteCount()在API小于12

当我search如何find一个图像的大小,然后将其保存在SD卡上,我发现这个:

bitmap.getByteCount(); 

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

getByteCount()只是一个方便的方法,它完全符合你放在else块中的内容。 换句话说,如果你只是简单地重写getSizeInBytes来总是返回“bitmap.getRowBytes()* bitmap.getHeight()”

这里:

何处是位图getByteCount()?

    所以,通过计算这个bitmap.getRowBytes() * bitmap.getHeight()我得到了价值120000 (117 KB)

    在SD卡上的图像大小是1.6 KB

    我错过了什么? 还是做错了?

    谢谢

    Related of "Android:bitmap.getByteCount()在API小于12"

    你做得对!

    知道这些值是否有效的一种快速方法是logging下来,如下所示:

     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 

    所以两者都计算相同的数字,我怀疑是内存大小的位图。 这与磁盘上的JPGPNG不同,因为它完全解压缩。


    有关更多信息,我们可以看看示例项目中的AOSP和源代码。 这是Android开发人员文档caching位图中示例项目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(); 

    参考文献:

    现在我正在使用这个:

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

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

    什么都没有丢失! 你的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等)的结果。

    这是另一种方法:

     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()的结果大,如果重新使用位图来解码其他尺寸较小的位图或手动重新configuration。 请参阅重新configuration(int,int,Bitmap.Config),setWidth(int),setHeight(int),setConfig(Bitmap.Config)和BitmapFactory.Options.inBitmap。 如果以这种方式未修改位图,则该值将与由getByteCount()返回的值相同。

    你可以试试这个代码

     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; 

    SD卡上的图像由于被压缩而具有不同的大小。 在设备上它将取决于宽度/高度

    为什么不尝试在1024之间进行分割? 获取KB而不是Bytes。