web-dev-qa-db-ja.com

ビジョンAPIからのバーコードスキャナーのプレビューサイズ

GoogleのAndroid Vision APIのバーコードリーダーの例を使用しています。プレビューサイズが利用可能なスペース全体を埋めていないようです(Nexus 4を使用していて、プレビューの右側にある白い未使用スペース、幅の約1/3)。

この例をさまざまなデバイスで実行し、常に使用可能なスペース全体を埋めるようにしたいと思います。

だから私が遊んでいるビットは:

CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector).setFacing(CameraSource.CAMERA_FACING_BACK).setRequestedPreviewSize(?, ?).setRequestedFps(15.0f);

何か案は?

ありがとう!

11
MMagician

このスレッドをご覧ください: https://github.com/googlesamples/Android-vision/issues/2

0
pm0733464

cameraSourcePreviewクラスから以下のコードを削除またはコメントするだけです

if (childHeight > layoutHeight) {
    childHeight = layoutHeight;
    childWidth = (int)(((float) layoutHeight / (float) height) * width);
}

このループでは、「CameraSourcePreview」クラスのchildHeightの代わりにlayoutHeightを使用します-for(int i = 0; i <getChildCount(); ++ i){...}

if (mCameraSource != null)
    {
        Size size = mCameraSource.getPreviewSize();
        if (size != null)
        {
            width = size.getWidth();
            height = size.getHeight();
        }
    }

    // Swap width and height sizes when in portrait, since it will be rotated 90 degrees
    if (isPortraitMode())
    {
        int tmp = width;

        //noinspection SuspiciousNameCombination
        width = height;
        height = tmp;
    }

    final int layoutWidth = right - left;
    final int layoutHeight = bottom - top;

    // Computes height and width for potentially doing fit width.
    int childWidth = layoutWidth;
    int childHeight = (int) (((float) layoutWidth / (float) width) * height);

    for (int i = 0; i < getChildCount(); ++i)
    {
        getChildAt(i).layout(0, 0, childWidth, layoutHeight);
    }

    try
    {
        startIfReady();
    }
    catch (SecurityException se)
    {
        Log.e(TAG, "Do not have permission to start the camera", se);
    }
    catch (IOException e)
    {
        Log.e(TAG, "Could not start camera source.", e);
    }
}
15
Akash Dubey

カメラの画像を画面全体に表示するには、2つの方法があります。

  1. Akesh Dubeyの回答 、レイアウトの幅と高さに合わせて画像全体を拡大して表示します。ただし、アスペクト比は保持されません。
  2. 以下の私の答えは、アスペクト比を犠牲にすることなく画像をトリミングしてフィットさせることです。

画像をトリミングするには、1つ変更するだけです><。以下のifステートメントを見つけて、次のように条件を変更します。

if (childHeight < layoutHeight) {
    childHeight = layoutHeight;
    childWidth = (int)(((float) layoutHeight / (float) height) * width);
}
6