当我在将图像保存到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
。
我缺少什么?或做错了?
谢谢
答案 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 中使用的文件/**
* 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的实现:
我认为尺寸的差异是图像压缩的结果(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而不是字节。