3

タイトルが重複しているように聞こえることはわかっていますが、すべての検索から解決できない非常に特殊な状況がここにあると思います.

まず、特定のモニターに基づいて特別にサイズ設定された画像があります (はい、モニターです。ハンドヘルド デバイスの画面ではありません)。画像は、次の特定の設定に基づいています。

  • 1600x900 20 インチ モニター、96ppi

ここで、すべての画像のサイズをミリメートル単位で指定する必要があります (これらは正方形の画像なので、高さ = 幅)。これらの特定の設定を決定要因として使用すると、1mm = 3.78px. だから、私の画像はこれを使ってサイズ調整されています。たとえば、画像を 65mm として表示するには、画像のサイズを 246px にします。これらの設定を使用して Photoshop でこれをテストしたところ、実際に画面上の画像を測定すると正しい結果が得られました。

そこで、私の Android アプリケーションで、これらの画像をロードしてImageViews表示します。これは私が立ち往生しているところです。デバイスは MDPI デバイスです。画像を MDPIdrawablesフォルダーにロードすると、画像がモニターに大きく表示されます。上記の例を使用して、 を に変換しDrawableBitmap画像の高さをログにダンプします。これは正しく、246px を示していますが、何らかの理由で 65mm ではなく 85mm をはるかに超えています。

すべての画像を HDPI にロードすると (はい、mdpi デバイスであるため、Android OS によってサイズが調整されます)、画像の高さ (私の例を使用) は 164px としてダンプされ、約 50mm で表示されます。これはより説明しやすいのですが、Photoshop で行ったようにこれらの画像を表示する方法についてはまだ混乱しています。

だから私の質問はImageView、画像の正確なサイズになるようにプログラムでサイズを変更する最良の方法は何ですか? 私の例では、246px の正方形の画像 (96ppi) が 65mm として表示されない理由を見つける必要があります。

これらImageViewはプログラムで生成されるため、次の 2 つのことを試しました。

  1. ImageView高さと幅を ( を使用してLayoutParams) 画像の高さ (246px) に設定します。私はこの考えをしたのですが、本来WRAP_CONTENTの行動をしていませんでした。
  2. のサイズが画像と正確に一致ImageView.ScaleType.CENTERすることを確認するために使用されます。ImageView

これらのどちらも出力に影響を与えていないようです。

更新:

デバイスが MDPI デバイスであることを確認しました。これは、1:1 の関係により、DPI から PX への変換 (またはその逆) が必要ないことを意味します。どこかでサイズが大きくなっていて、どこにあるのかわかりません。以下の回答のコメントで示したように、ドローアブルをプルしてビットマップに変換すると、作成した正確なピクセルの高さがプルされます。本来あるべきサイズ (65mm 対 85mm) とのサイズの違いのパーセンテージを把握し始めており、23.529% であることがわかりました。この値を差し引いてビットマップをスケーリングしていますが、イメージの品質が損なわれます。

私はあきらめ始めています。

私が利用しているデバイスは MK802III Rockchip デバイスです ( Amazon リンク)

4

2 に答える 2

2

Android は、表示するすべての画像を次の式で変更します。

px = dp * (dpi / 160)

ここで、「dpi」は、デバイスのディスプレイの 1 インチあたりのドット数で表した画面密度です。

さらに、Android は、drawable表示する画像を決定する際にフォルダーの階層を調べます。ご存知のように、HDPI デバイスはdrawale-hdpiフォルダーの画像を使用し、MDPI デバイスはディレクトリの同じ名前の画像を表示しますdrawable-mdpi

ただし、MDPI デバイスがdrawable-mdpiディレクトリ内に画像を見つけられない場合、最終的にはdrawable-hdpiフォルダーから選択しますが、MDPI 画面に表示するために画像を縮小します。

drawable-hdpiこれは、フォルダーに保存したときに画像が小さく見える理由を説明しています。

drawable-mdpiただし、フォルダに正しく配置したときに画像が大きすぎるように見える理由は説明されていません。

次のことが起こります。

65mm ~= 85mm * (120 / 160)

50mm ~= 85mm * (120 / 240)

これは、報告されているように、デバイスが MDPI (160dpi) ではなく LDPI (120dpi) である場合に、画像に期待されるスケーリングです。

于 2013-03-29T23:39:22.943 に答える
1

私は自分の質問に答えるのが嫌いですが、私がしたことをみんなに更新するつもりです. 誰かがより良い解決策を思いついたら、私はすべて耳を傾けます. 締め切りが迫っているので、これを無理やり進めなければなりませんでした。

測定可能なボックスをダンプするダミー アプリケーションを作成しました。これらを使用して、1 mm は 3 密度ピクセルであると判断しました。繰り返しますが、1mm = 3dpです。

この値を使用して、すべての画像のサイズを (PHP スクリプトを使用して) この制約に合わせて変更しました。私の画像はすべて正常に表示されています。195dp = 65mm と表示されます。

私が言ったように、なぜ私がこれをしなければならなかったのかについての説明があれば、あなたは賛成票と答えを得ます。

于 2013-03-30T11:43:46.943 に答える