23

The app I'm writing requires camera functionality. So to learn about how to operate the camera, I followed this script:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

I have put the activity in my manifest, set the screen orientation for it on landscape mode.

The problem I'm having is, when the camera is held sideways (so I hold my Galaxy Tab P1000 in landscape position) the view is stretched out.

To be more specific about my script, I used an exact copy of code that Google made. It can be found in the android-sdk\samples\android-8\ApiDemos\src\com\example\android\apis\graphics\

The file itself is called CameraPreview.

I really have no clue why the screen looks so stretched. Of course, the format is weird and not square, but still, when using the default camera app installed on the device, it doesn't deform at all. This camera deforms the image when I hold it sideways and move the camera even a little.

enter image description here

enter image description here

What I did was: I held my galaxy tab to take a picture of an object (laptop in this case) then took a picture with my phone of my Galaxy. On the Galaxy I have the camera screen open in the app i'm making. This counts for both images. One I hold sideways and one I hold in portrait view. The pics are a bit unclear but you can see that in the landscape picture, the camera has become massively wide.

4

2 に答える 2

22

私は昨日同じ問題に直面しました。「カメラ」ソースを調査した後、カメラのプレビューが引き伸ばされる理由を見つけました。

その理由は次のとおりです。SurfaceView のアスペクト比 (幅/高さ) は、プレビュー パラメータで使用される Camera.Size のアスペクト比と同じでなければなりません。縦横比が同じでない場合は、引き伸ばされた画像になります。

そのため、最も速い回避策は、SurfaceView を 320px x 240px のようなサイズ (Parameters.getSupportedPreviewSizes() でサポートされている最小サイズ) に設定することです。

また、カメラの標準アプリケーション ソースを見ることができます。これは、SurfaceView サイズを制御するためにカスタム レイアウトを使用します (PreviewFrameLayout.java、onMeasure() 関数を参照)。

使用する

git クローンhttps://android.googlesource.com/platform/packages/apps/Camera.git

カメラソースを取得します。

于 2012-03-03T11:27:34.630 に答える
8
public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub

        try {
            camera = Camera.open();

            camera.setDisplayOrientation(90);
            camera.setPreviewDisplay(holder);
            Camera.Parameters parameters = camera.getParameters();
            List<Size> sizes = parameters.getSupportedPictureSizes();
            parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0
            parameters.set("orientation","portrait");
            //parameters.setPreviewSize(viewWidth, viewHeight);
            List<Size> size = parameters.getSupportedPreviewSizes();
            parameters.setPreviewSize(size.get(0).width, size.get(0).height);
            camera.setParameters(parameters);
            camera.startPreview();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

必要なのは、次getSupportedPreviewSizes()の場所に保存するだけListです。

List<Size> size = parameters.getSupportedPreviewSizes();
            parameters.setPreviewSize(size.get(0).width, size.get(0).height);
            camera.setParameters(parameters); 



camera.startPreview(); 

これがお役に立てば幸いです。

于 2012-10-06T04:32:34.450 に答える