SDカードに保存する前に画像のサイズを見つける方法を検索したところ、次のことがわかりました。
_bitmap.getByteCount();
_
しかし、そのメソッドはAPI 12に追加されており、私はAPI 10を使用しています。それで、もう一度これを見つけました。
getByteCount()は、elseブロックに配置した内容を正確に実行する便利なメソッドです。つまり、getSizeInBytesを単純に書き直して、常に「bitmap.getRowBytes()*ビットマップ.getHeight()」を返すようにした場合
ここに:
ビットマップ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とソースを参照してください。これは、サンプルプロジェクト BitmapFun で使用されているファイルですAndroid開発者向けドキュメントビットマップのキャッシュ
/**
* 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カードの画像のサイズ(バイト単位)と完全に一致するためです。
何も欠けていません!コードスニペットは、Androidからの実装を正確に示しています-ソース:
サイズの違いは画像圧縮(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 for getAllocationByteCount()
のステートメント:
これは、ビットマップを再利用してサイズの小さい他のビットマップをデコードする場合、または手動で再構成する場合、getByteCount()の結果よりも大きくなる可能性があります。 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;
sDカードの画像は圧縮されているため、サイズが異なります。デバイスでは、幅/高さに依存します
1024に分割してみませんか?バイトの代わりにKBを取得します。