15

ポートレート モードでは画像が垂直方向に引き伸ばされて表示され、ランドスケープ モードでは水平方向に引き伸ばされて表示されます。

画像をキャプチャした後、適切なサイズで表示されますが

この問題を解決するにはどうすればよいですか?

4

6 に答える 6

8

表示サイズに合ったプレビュー サイズを選択する必要があります。プレビュー サイズの設定を変更することをお勧めしますSurfaceView。プレビュー データは問題ありませんが、歪んでいません。縦横比の異なる面にぶつけると歪んで見えます。

全画面表示の場合、カメラのプレビュー サイズがそのサイズに一致することがわかるはずです。少なくとも、同じ縦横比のカメラが存在するはずです。たとえば、画面が 640x480 の場合、320x240 のプレビュー サイズはフルスクリーンで引き伸ばされて表示されませんSurfaceView

于 2012-06-29T13:45:33.677 に答える
4

(1) 利用可能なプレビュー サイズ (2) ビューに基づいて、プレビュー サイズを制限する必要があります。それでも必要な場合の私の解決策は次のとおりです。

private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    private void startPreview() {
        try {
        /**
         * Orientation should be adjusted, see http://stackoverflow.com/questions/20064793/how-to-fix-camera-orientation/26979987#26979987
         */

            Camera.Parameters parameters = mCamera.getParameters();
            List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
            Camera.Size previewSize = null;
            float closestRatio = Float.MAX_VALUE;

            int targetPreviewWidth = isLandscape() ? getWidth() : getHeight();
            int targetPreviewHeight = isLandscape() ? getHeight() : getWidth();
            float targetRatio = targetPreviewWidth / (float) targetPreviewHeight;

            Log.v(TAG, "target size: " + targetPreviewWidth + " / " + targetPreviewHeight + " ratio:" + targetRatio);
            for (Camera.Size candidateSize : previewSizes) {
                float whRatio = candidateSize.width / (float) candidateSize.height;
                if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) {
                    closestRatio = whRatio;
                    previewSize = candidateSize;
                }
            }

            Log.v(TAG, "preview size: " + previewSize.width + " / " + previewSize.height);
            parameters.setPreviewSize(previewSize.width, previewSize.height);
            mCamera.setParameters(parameters);
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }
 }
于 2014-11-10T16:09:25.757 に答える
3

camera.startPreview() を呼び出す前にこれを追加して、これを修正しました。

Camera.Parameters parameters = camera.getParameters(); 
parameters.setPreviewSize(yourSurfaceView.getWidth(), yourSurfaceView.getHeight());
camera.setParameters(parameters);

それは誰かを助けるかもしれません。

于 2012-12-22T12:18:49.417 に答える
-1

解決策は簡単です!アクションバーの下でサーフェスビューを使用する場合、これが問題になる可能性があります。この行を使用して修正できますが、アクションバーを使用してテストしていません。

これを使って:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
于 2015-06-27T20:35:03.410 に答える
-3

プレビューについて話している場合は、SurfaceView のサイズをカメラのプレビュー サイズと同じに設定してみてください。そうすれば、プレビューは拡大縮小されません。

于 2012-06-29T13:22:11.000 に答える