1

カスタムクラスを書いています。実際に描画される前に、いくつかの前処理とサイズ設定のために計算する必要があるビットマップがあります。ビットマップ自体は、前処理された 9 パッチ イメージです。コンストラクターには、次のコードがあります。

BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
bmpOptions.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), BITMAP_ID, bmpOptions);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), BITMAP_ID);
        
Log.d(getClass().getSimpleName(), "width: " + bmp.getWidth() + " " + bmpOptions.outWidth + "; height: " + bmp.getHeight() + " " + bmpOptions.outHeight);

Android 3.2.2 を実行している 7 インチ Samsung Galaxy Tab 7 での出力:

幅: 556 556; 高さ: 890 890

Android 4.1 を実行している 10 インチ Motorola Xoom での出力:

幅: 556 556; 高さ: 890 890

Android 4.2.2 を実行している 7 インチの Nexus 7 での出力:

幅: 740 834; 身長; 1185 1335

ビットマップの実際のサイズは次のとおりです。

mdpi: 558×892

hdpi:836×1337

ビットマップは前処理された 9 パッチであるため、サイズが 2 ピクセルずれています。Nexus 7 の hdpi アセットがこれほど大きな違いを生む理由がわかりません。

これらの構成も試しました:

bmpOptions.inScaled = false;

bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;

bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
bmpOptions.inDensity = getResources().getDisplayMetrics().densityDpi;

bmpOptions.inTargetDensity = 0;
bmpOptions.inDensity = 0;

また、逆のアプローチを試し、デコードされたビットマップ用に 2 番目の BitmapFactory.Options を作成し、まったくスケーリングしないように指示しました。

これらはすべて同じ正確な結果を提供します。

4

3 に答える 3

5

inJustDecodeBoundsオプションを使用して実際の画像サイズを取得するには、返されたoutWidthoutHeightをinTargetDensity/inDensityに等しいスケール係数で乗算する必要があります。サンプルコードは次のとおりです。

public static void getBitmapDims(Resources res, int resId, Holder<Integer> width, Holder<Integer> height)
{
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, opts);

    float scale = (float) opts.inTargetDensity / opts.inDensity;

    width.value = (int) (opts.outWidth * scale + 0.5f);
    height.value = (int) (opts.outHeight * scale + 0.5f);
}
于 2013-07-09T13:30:54.097 に答える
2

最初の 3 行は 4 行目には影響しません。これは、4 行目はそれより上の変数を使用していないためです。また、「bmpOptions」は使用されず、まったく入力されません。この質問を投稿しているときに、変数の名前を変更した可能性がありますか?

また、ビットマップ画像ファイルが密度修飾子 (または mdpi のようなデフォルトのもの) を持つフォルダーにある可能性はありますか?

ファイルを drawable-nodpi に入れた場合にのみ、幅と高さのピクセル数は常に同じになります。

于 2013-03-02T10:39:17.367 に答える