1

触れたポイントの色を取得するのに奇妙な問題があります。画像(.bmp)を作成し、ペイント缶で塗りつぶしました。グラデーションやその他の色はありません。ほとんどの場合、画面に触れると期待どおりの色になりますが、わずかに異なる色になることもあります。私のコードは十分に単純なようです:

 final Bitmap bm2 = BitmapFactory.decodeFile(image_overlay);
 if (bm2!=null) {
    overlayimage.setImageBitmap(bm2);
    image.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent mev) {
            Log.d(MY_DEBUG_TAG, "onTouch()");
            DecodeActionDownEvent(v, mev, bm2);
            return false;
        }
    });
 }


 private void DecodeActionDownEvent(View v, MotionEvent ev, Bitmap bm2)
 {
    Log.d(MY_DEBUG_TAG, "DecodeActionDownEvent()");
    xCoord = new Integer((int)ev.getRawX());
    yCoord = new Integer((int)ev.getRawY());
    colorTouched = bm2.getPixel(xCoord, yCoord);
    Log.d(MY_DEBUG_TAG, "The coordinates touched were x: " + xCoord + "; y: " + yCoord);
    Log.d(MY_DEBUG_TAG, "The color touched was (hex) " + Integer.toHexString(colorTouched));
 }

最近、「ミス」が発生し、スポイトツールを動かして正確な位置に画像の座標を確認しました。そのピクセルは、その領域の他のピクセルと同じです。

Androidが正確な色を返すことを期待するのは「安全」ではありませんか?ターゲットを#ff424542でペイントした場合、そのターゲットにヒットした場合、#ff424542のピクセルカラーが得られると想定するのは安全ではありませんか?この場合、androidは#ff4a454aを返していました。添付の画像は私の「image_overlay」ファイルです。私がターゲットにしている領域は、右中央の濃い灰色です。私が言ったように、ほとんどの場合それは完璧に機能しますが、私が明らかにターゲットゾーンにいるときでさえ、時々私はミスを記録します。私のログから、最近のミスはx:360、y:399およびx:368、y:399でした。成功したヒットはx:363、y:393およびx:365、y434でした。

image_overlay

4

1 に答える 1

0

画像を生成した PC のアプリでスポイト ツールを使用していると思いますか? 次に、Android で作業している画像が PC で作業している画像と同じであると想定しています。ただし、これは安全な仮定ではありません。解像度、DPI など、ソース ビットマップのプロパティは何ですか。それから、Bitmap.decodeFile を見てください。手がかりは「デコード」にあります。デフォルトでは (したがって、ビットマップ プロパティに関する質問)、Android はファイル指定子からビットマップを読み取ってメモリにロードするだけではありません。たとえば、ソース コードを詳しく調べてみないとわかりませんが、おそらく decodeFile は結果のビットマップをディザリングしています。

入力ビットマップのデコード方法を制御するには、BitmapFactoryOptions を使用する必要があります。

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

于 2012-06-18T20:49:28.540 に答える