Android: bitmap.getByteCount() in API lesser than 12



当我在将图像保存到SD卡之前搜索如何查找图像的大小时,我发现:

bitmap.getByteCount();

但是该方法已添加到 API 12 中,我使用的是 API 10。所以我又发现了这个:

getByteCount() 只是一个方便的方法,它完全按照你放在 else-block 中的方式执行。换句话说,如果你简单地重写getSizeInBytes以始终返回"bitmap.getRowBytes() * bitmap.getHeight()"

这里:

Bitmap getByteCount()到底在哪里?

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

其中,SD卡上的图像大小为1.6 KB

我错过了什么?

还是做错了什么?

谢谢

你做对了!

确定值是否有效的一种快速方法是像这样记录它:

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开发人员文档中的示例项目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();

引用:

  • http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
  • http://code.google.com/p/adamkoch/source/browse/bitmapfun/

现在我正在使用这个:

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

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

什么都不见了!您的代码片段显示了来自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()

如果位图是 重复使用以解码其他较小尺寸的位图,或通过手动解码 重 构。参见 reconfigure(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;
<</div> div class="one_answers">

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

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

最新更新