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
常にではありませんが、ほとんどの場合、画像の縦横比とプレビューの縦横比は一致しています。少なくともそれらのいくつかは、クラシックな4:3比(例:640x480)であることを保証できます。 16:9のサポートも広く利用可能です。
画面のアスペクト比は異なる場合があります。カメラ画像で正しく埋めるために、黒の余白を追加することは広く受け入れられています(YouTubeでも同じアプローチが使用されています)。または、カメラ画像をトリミングして画面全体に表示することもできます。
画面サイズ(さまざまなデバイスの技術仕様で報告されている)は、実際に画像ディスプレイで常に使用できるとは限らないことに注意してください。たとえば、システムメニューやタイトルバーなどが、画面のスペースを占有する場合があります。 没入モードは一部のデバイスで使用でき、その動作はシステムのバージョンによって異なります。 Androidの将来の開発、たとえばセカンドスクリーンのサポートは、ゲームをさらに面白いにします。
だから、あなたの特定の質問への答え:
frameLayoutサイズにmatch_parentまたはfitXYを使用し、プレビューサイズと画像サイズの2つの変数のみを使用するのが最善ですか? -no。
両方のサイズで一致するのは常にありますか?-yesが、おそらくこのサイズは最適ではありません。
カメラが異なる「ワイド」画像サイズをサポートしている場合でも、 1280x720 プレビューと 2560x1440 pictureは、_16:9
_で正確に一致する場合があります。通常、小さいサイズの画像の品質は同じサイズでプレビューするよりも大幅に優れているわけではないため、_1280x720
_が本当に必要な場合は、プレビューフレームを保存することを選択できます。
takePicture()
を省略することができれば、アプリの応答性が大幅に向上します。
可能なアルゴリズム:
1)出力領域のアスペクト比(=幅/高さ)を取得します
2)サポートされているサイズを反復処理する:
アスペクト比が近い最大値(+ -5%など)を選択します。近くに何もない場合や解像度が低すぎる場合は、フレームを描画するyorサーフェスをサポートされる最大サイズと同じアスペクト比にし、親ビューの中央に配置します。
ただし、プレビューサイズと画像サイズがあります。アスペクト比を同じにしたい場合-1)で選択した画像サイズのアスペクト比を使用することをお勧めします
役立つことを願っています)
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に依存します。したがって、カメラを使用する場合はデフォルトを使用する必要があります。