web-dev-qa-db-ja.com

Android:APIのbitmap.getByteCount()が12未満

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_です。

何が足りないのですか?または間違っていますか?

ありがとうございました

20
Archie.bpgc

あなたはそれを正しくやっています!

値が有効かどうかを確認する簡単な方法は、次のようにログに記録することです。

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開発者向けドキュメントビットマップのキャッシュ

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();

参照:

32
pjco

今のところ私はこれを使用しています:

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

サイズとして合計バイト数を取得します。ここで取得した値は、SDカードの画像のサイズ(バイト単位)と完全に一致するためです。

5
Archie.bpgc

何も欠けていません!コードスニペットは、Androidからの実装を正確に示しています-ソース:

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など)の結果だと思います。

2
darkNeuron

別の方法は次のとおりです。

_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()によって返される値と同じになります。

2
Enzokie

このコードを試すことができますか

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;
1
steevoo

sDカードの画像は圧縮されているため、サイズが異なります。デバイスでは、幅/高さに依存します

0
Rafael Sanches

1024に分割してみませんか?バイトの代わりにKBを取得します。

0
NemesisDoom