web-dev-qa-db-ja.com

Androidのカメラ、最適なサイズ、プレビューサイズ、画像サイズ、表示サイズ、画像のゆがみを取得する方法

openGLからのビューとAndroidカメラを使用してtakepictureメソッドを使用するときに両方のイメージを取得するときにイメージが歪む。カメラのプレビューは両方とも1280x720に設定されていました。

カメラの画像サイズを1280x720に設定しましたが、結果は完璧でした。ただし、各Androidデバイスは異なり、プレビューサイズと画像サイズの両方の設定はサポートされているサイズのリストから選択する必要があるため、コードでサイズを設定することはできません。

ここには、アクティビティレイアウトの画面サイズ、カメラプレビューサイズ、画像サイズの3つの変数があることを考慮して、これを行う最適な方法は何ですか。

frameLayoutサイズにmatch_parentまたはfitXYを使用し、プレビューサイズと画像サイズの2つの変数のみを使用するのが最善ですか?

プレビューサイズと画像サイズの幅と高さの組み合わせのいくつかが同じであることに注意してください。たとえば、1280 x 720はプレビューと画像の両方に存在しますが、両方のサイズで一致する場合は常にありますか?

 List<Size> previewSizes = mCamera.getParameters().getSupportedPreviewSizes();

 List<Size> imageSizes = mCamera.getParameters().getSupportedPictureSizes();

 // layout in the activity that the cameraView will placed in
 int layoutWidth = frameLayout.getWidth();
 int layoutHeight = frameLayout.getHeight();

たとえば、1つのAndroidタブレットの測定後、これらは使用された3つの変数の結果です

測定結果としてのアクティビティのレイアウトviewGroupのサイズ

 1280 x 736

サポートされている画像サイズ

 320 x 240
 640 x 480
 1024 x 768
 1280 x 720 << best size in my example to use
 1280 x 768
 1280 x 920
 1600 x 1200
 2048 x 1536
 2560 x 1440
 2560 x 1536
 2560 x 1920  << native resolution of hardware camera

サポートされているプレビューサイズ

 176 x 144
 320 x 240
 352 x 288
 480 x 320
 480 x 368
 640 x 480
 800 x 480
 800 x 600
 864 x 480
 864 x 576
 960 x 540
 1280 x 720 << best size in my example to use
 1280 x 768
 1280 x 960
18
Kevik

常にではありませんが、ほとんどの場合、画像の縦横比とプレビューの縦横比は一致しています。少なくともそれらのいくつかは、クラシックな4:3比(例:640x480)であることを保証できます。 16:9のサポートも広く利用可能です。

画面のアスペクト比は異なる場合があります。カメラ画像で正しく埋めるために、黒の余白を追加することは広く受け入れられています(YouTubeでも同じアプローチが使用されています)。または、カメラ画像をトリミングして画面全体に表示することもできます。

画面サイズ(さまざまなデバイスの技術仕様で報告されている)は、実際に画像ディスプレイで常に使用できるとは限らないことに注意してください。たとえば、システムメニューやタイトルバーなどが、画面のスペースを占有する場合があります。 没入モードは一部のデバイスで使用でき、その動作はシステムのバージョンによって異なります。 Androidの将来の開発、たとえばセカンドスクリーンのサポートは、ゲームをさらに面白いにします。

だから、あなたの特定の質問への答え:

frameLayoutサイズにmatch_parentまたはfitXYを使用し、プレビューサイズと画像サイズの2つの変数のみを使用するのが最善ですか? -no

両方のサイズで一致するのは常にありますか?-yesが、おそらくこのサイズは最適ではありません。

カメラが異なる「ワイド」画像サイズをサポートしている場合でも、 1280x720 プレビューと 2560x1440 pictureは、_16:9_で正確に一致する場合があります。通常、小さいサイズの画像の品質は同じサイズでプレビューするよりも大幅に優れているわけではないため、_1280x720_が本当に必要な場合は、プレビューフレームを保存することを選択できます。

takePicture()を省略することができれば、アプリの応答性が大幅に向上します。

14
Alex Cohn

可能なアルゴリズム:

1)出力領域のアスペクト比(=幅/高さ)を取得します

2)サポートされているサイズを反復処理する:

アスペクト比が近い最大値(+ -5%など)を選択します。近くに何もない場合や解像度が低すぎる場合は、フレームを描画するyorサーフェスをサポートされる最大サイズと同じアスペクト比にし、親ビューの中央に配置します。

ただし、プレビューサイズと画像サイズがあります。アスペクト比を同じにしたい場合-1)で選択した画像サイズのアスペクト比を使用することをお勧めします

役立つことを願っています)

1
Sam

preview size, picture sizeは、すべてのAndroidデバイスをサポートするように設定されたカメラです。つまり、preview size, picture size設定することにした場合は、すべてのデバイスがサポートしている一般的な形式で適切です。 1280x720などです。

次のコードのように、元です。私が使用したもの。

// start preview with new settings
    try {
        // set preview size and make any resize, rotate or
        // reformatting changes here
        Camera.Parameters parameters = mCamera.getParameters();

        for (Camera.Size size : parameters.getSupportedPictureSizes()) {
            // 640 480
            // 960 720
            // 1024 768
            // 1280 720
            // 1600 1200
            // 2560 1920
            // 3264 2448
            // 2048 1536
            // 3264 1836
            // 2048 1152
            // 3264 2176
            if (1600 <= size.width & size.width <= 1920) {
                parameters.setPreviewSize(size.width, size.height);
                parameters.setPictureSize(size.width, size.height);
                break;
            }
        }
        // Set parameters for camera
        CustomCamera.mCamera.setParameters(parameters);

        Camera.Size size = CustomCamera.mCamera.getParameters().getPictureSize();

        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }

Best size Camera MPに依存します。したがって、カメラを使用する場合はデフォルトを使用する必要があります。

1
Huy Tower