1

顔の周りに長方形が描かれたユーザー画面に画像を表示するための次のコードがあります。

public class AndroidFaceDetector extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.main);
        setContentView(new myView(this));
    }

    private class myView extends View {

        private int imageWidth, imageHeight;
        private int numberOfFace = 5;
        private FaceDetector myFaceDetect;
        private FaceDetector.Face[] myFace;
        float myEyesDistance;
        int numberOfFaceDetected;

        Bitmap myBitmap;

        public myView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub

            BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
            BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;

            myBitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/face.jpg", BitmapFactoryOptionsbfo);

            imageWidth = myBitmap.getWidth();
            imageHeight = myBitmap.getHeight();
            myFace = new FaceDetector.Face[numberOfFace];
            myFaceDetect = new FaceDetector(imageWidth, imageHeight,
                    numberOfFace);
            numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace);

        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub

            canvas.drawBitmap(myBitmap, 0, 0, null);

            Paint myPaint = new Paint();
            myPaint.setColor(Color.GREEN);
            myPaint.setStyle(Paint.Style.STROKE);
            myPaint.setStrokeWidth(3);

            for (int i = 0; i < numberOfFaceDetected; i++) {
                Face face = myFace[i];
                PointF myMidPoint = new PointF();
                face.getMidPoint(myMidPoint);
                myEyesDistance = face.eyesDistance();
                canvas.drawRect((int) (myMidPoint.x - myEyesDistance),
                        (int) (myMidPoint.y - myEyesDistance),
                        (int) (myMidPoint.x + myEyesDistance),
                        (int) (myMidPoint.y + myEyesDistance), myPaint);
            }
        }
    }
}

私のSony Ericsson x8に次のように表示されます。

x8 スクリーンショット

ソニーのXperiaでの表示は次のとおりです。

ここに画像の説明を入力

どのデバイスの画面にも合うように画像をスケーリングする方法を知っている人はいますか?? ありがとう !

更新 次のことを試しましたが、うまくいきません。

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    DisplayMetrics metrics=new DisplayMetrics();

    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    height=metrics.heightPixels/metrics.xdpi;
    width=metrics.widthPixels/metrics.ydpi;
    // setContentView(R.layout.main);
    setContentView(new myView(this));
}

@Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub

        canvas.drawBitmap(myBitmap, 0, 0, null);

        Paint myPaint = new Paint();
        myPaint.setColor(Color.GREEN);
        myPaint.setStyle(Paint.Style.STROKE);
        myPaint.setStrokeWidth(3);

        for (int i = 0; i < numberOfFaceDetected; i++) {
            Face face = myFace[i];
            PointF myMidPoint = new PointF();
            face.getMidPoint(myMidPoint);
            myEyesDistance = face.eyesDistance();
            canvas.drawRect((int) (myMidPoint.x - myEyesDistance),
                    (int) (myMidPoint.y - myEyesDistance),
                    (int) (myMidPoint.x + myEyesDistance),
                    (int) (myMidPoint.y + myEyesDistance), myPaint);
        }


        canvas.scale(width, height);
    }
}
4

3 に答える 3

2
DisplayMetrics metrics=new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metrics);
float height=metrics.heightPixels/metrics.xdpi;
float width=metrics.widthPixels/metrics.ydpi;
canvas.drawRect(0, 0, width, height, paint);
于 2013-06-02T19:53:53.560 に答える
2

キャンバスに描画する前に、キャンバスをスケーリングします。

http://developer.android.com/reference/android/graphics/Canvas.html#scale(float,%20float)

編集: または、Gabe が言及しているように新しいビットマップを生成します。キャンバス メソッドを使用したハードウェア アクセラレーション スケーリングをサポートする最新のデバイスでは、実行時のコストが非常に低くなりますが、大きなビットマップをメモリに保持すると、小さなバージョンを保持するよりも多くのメモリが消費されます。何らかの理由でフル解像度バージョンをメモリに保持する必要がある場合は、新しいデバイスでは描画時にスケーリングする方が効率的です。フル解像度版が二度と必要ない場合は、元の画像が大きければ拡大縮小されたビットマップを作成して元の画像を破棄すると、メモリの使用量が少なくなります。

于 2013-06-02T19:36:06.103 に答える
1

ビットマップを描画するときは、Bitmap.createScaledBitmap を使用してビットマップをビューの幅と高さに合わせてスケーリングします。そしたら合います。ビットマップ上のすべてのポイントの一貫性を保つようにしてください。元のビットマップまたはスケーリングされたビットマップの位置を使用してください。混合して一致させないでください。そうしないと、奇妙な結果が得られます。

于 2013-06-02T19:35:47.347 に答える