当我在将图像保存到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
所以两者都在计算相同的数字,我怀疑这是位图的内存大小。 这与磁盘上的JPG或PNG不同,因为它是完全未压缩的。
有关更多信息,我们可以查看示例项目中的 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 而不是字节。