21

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

私は何が欠けていますか?または間違っていますか?

ありがとうございました

4

7 に答える 7

33

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

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

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

参考文献:

于 2013-03-29T21:53:13.957 に答える
6

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

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

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

于 2012-09-26T10:41:20.763 に答える
2

何も欠けていません!コードニペットは、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など)によるものだと思います。

于 2012-09-25T14:34:39.403 に答える
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() によって返される値と同じになります。

于 2015-09-15T06:54:44.603 に答える
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;
于 2012-09-26T06:16:45.420 に答える
0

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

于 2013-02-28T18:43:33.087 に答える