2

コードに対する権利。与えられた

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId);
Drawable drawable = getResources().getDrawable(resId);

私は得る

bitmap.getWidth() == drawable.getIntrinsicWidth() == 9

実際の画像は6x6ピクセルですが。ポイントは、密度が240であるということです。したがって、スケールは1.5になりDENSITY_DEFAULT = 160ます。それ自体はそのような問題ではありませんがbitmap.getPixel(x, y);、拡大された寸法でも機能します。

設定ビットマップの密度は違いがないようです。実際の位置のピクセルについて画像をクエリするにはどうすればよいですか?すべてを密度で割るのはやめたほうがいいです(多くの場合、不可能ですらあります)。

ありがとう

4

1 に答える 1

5

最初に、ここで何が起こっているかについていくつかコメントします。取得したビットマップは実際にリサンプリングされます。そのピクセルデータは9x9画像用です。このメソッドbitmap.getWidth()は、への呼び出しの影響を受けませんbitmap.setDensity()

Androidフレームワークがビットマップをリサンプリングしないようにしながらビットマップをロードするには、BitmapFactory.Optionsインスタンスを作成し、inScaledをに設定てからfalse、これをdecodeResource()に渡します。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId, options);
// Now bitmap.getWidth() == 6

UIで使用されるのはリサンプリングされたバージョンであることに注意してください(明示的に回避しない限り)。したがってbitmap.getPixel(x,y);、UIで描画されるビットマップで実行する場合は、を使用しないでくださいinScaled = false

于 2011-10-28T14:01:37.250 に答える