解码后的位图字节大小?


69

我如何确定/计算位图的字节大小(使用BitmapFactory解码后)?我需要知道它占用了多少内存空间,因为我正在我的应用程序中进行内存缓存/管理。(文件大小不足,因为它们是jpg / png文件)

感谢您的任何解决方案!

更新:getRowBytes * getHeight可能会解决问题。.我将以这种方式实施,直到有人提出反对。

Answers:


119

getRowBytes() * getHeight() 似乎对我来说很好。

更新到我大约2岁的答案:由于API级别12位图具有直接查询字节大小的方法:http : //developer.android.com/reference/android/graphics/Bitmap.html#getByteCount%28%29

----样本代码

    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
    protected int sizeOf(Bitmap data) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) {
            return data.getRowBytes() * data.getHeight();
        } else {
            return data.getByteCount();
        }
    }

1
尝试如下:original = BitmapFactory.decodeStream(getAssets()。open(“ hd.jpg”))); sizeOf(原始); ByteArrayOutputStream out =新的ByteArrayOutputStream(); original.compress(Bitmap.CompressFormat.WEBP,50,out); 已解码的位图= BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); sizeOf(已解码); 当我在您的方法中调试时,即使第二张图像被压缩,我也会得到相同数量的字节!任何意见?
TharakaNirmana 2013年

1
@TharakaNirmana位图始终包含未压缩的图像。压缩仅用于缩小图像以保存到文件。
Ridcully

1
是时候更新和添加的kitkat方法了getAllocationByteCount()。见developer.android.com/reference/android/graphics/...
板井Hanski

1
我有一个图像,但是如果我将其运行到两个不同的图像中,则在两个设备中我都会由于不同的原因得到不同的图像大小?例如,在Galaxy S Duos中,它提供656 KB,在MOTO G设备中,它返回1136 KB
Kalpesh Lakhani 2014年

3
@Kalpesh您的三星具有hdpi屏幕,而moto具有xhdpi,因此它将在这些型号上加载不同大小的资源。查看Google显示密度存储桶文档。
帕特里克·法夫尔2014年

54

最好只使用支持库:

int bitmapByteCount=BitmapCompat.getAllocationByteCount(bitmap)

但是,如果您有一个Android项目使用的minSdk至少为19(kitkat,表示4.4),则可以使用bitmap.getAllocationByteCount()


我正在使用BitmapCompat.getAllocationByteCount(scaledBitmap)获取分配字节数3145728。但是实际大小为207kB。我究竟做错了什么?
阿曼·维尔玛

@Sniper的实际大小是多少?如果您指的是文件大小,那是有道理的,因为文件已压缩。如今,没有人会在不将其编码为JPG / PNG / WEBP的情况下将其放入文件中。文件的大小不应与解码后的图像相同。每个图像的估计字节数为width*height*bytesPerPixel,其中bytesPerPixel通常为4或2。这意味着,如果您有1000x1000图像,则可能需要大约4 * 1000 * 1000 = 4,000,000字节,约4MB。
Android开发人员

我的onactivityResult中有一个位图,我想检查图像的大小,并检查大小是否大于5 mb,如果小于5 mb,则将其发送到我的服务器,否则提示用户拍摄新照片。
阿曼·维尔玛

1
@Sniper您将图像文件发送到服务器。通常是JPEG,PNG,WEBP ...所有这些文件都经过压缩后,通常占用不到5MB的存储空间。它们几乎总是占用比位图占用的内存少的存储空间。创建文件后,只需使用以下文件检查文件大小file.lengthdeveloper.android.com/reference/java/io/File.html#length()。它与位图无关。位图分辨率可能很大,也可能很小。您所谈论的是文件本身。
Android开发人员

感谢@androiddeveloper的澄清。
阿曼·维尔玛

21

这是利用KitKat的2014版本,getAllocationByteCount()其编写方式是使编译器理解版本逻辑(因此@TargetApi不需要)

/**
 * returns the bytesize of the give bitmap
 */
public static int byteSizeOf(Bitmap bitmap) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        return bitmap.getAllocationByteCount();
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
        return bitmap.getByteCount();
    } else {
        return bitmap.getRowBytes() * bitmap.getHeight();
    }
}

请注意,的结果可能大于将位图重新用于解码其他较小尺寸的位图或通过手动重新配置的结果。getAllocationByteCount() getByteCount()


是的,毕加索还使用此功能来计算位图大小。
wangzhengyi

我正在使用BitmapCompat.getAllocationByteCount(scaledBitmap)获取分配字节数3145728。但是实际大小为207kB。我究竟做错了什么?
阿曼·维尔玛

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

@ user289463答案的唯一区别是,使用getAllocationByteCount()KitKat及更高版本。


我正在使用BitmapCompat.getAllocationByteCount(scaledBitmap)获取分配字节数3145728。但是实际大小为207kB。我究竟做错了什么?
阿曼·维尔玛

1
@Sniper 207kB值是存储在磁盘上时的压缩文件大小。当它被加载到内存中时,它会被解压缩并使用您从函数中获得的字节数。
Bryan W
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.