2011-09-28 1 views
22

私が書いているアプリはカメラ機能が必要です。 だからカメラの操作方法について学ぶために、私はこのスクリプトを追っ:アンドロイドカメラがランドスケープモードで引き伸ばされる

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

私は風景モードでそれのために画面の向きを設定し、私のマニフェストに活動を入れています。

私が抱えている問題は、カメラを横に構えていると(私は自分のGalaxy Tab P1000を横長の位置に保持している)、ビューが引き伸ばされていることです。

私のスクリプトについて詳しくは、Googleが作成したコードのコピーを使用しました。 android-sdk \ samples \ android-8 \ ApiDemos \ src \ com \ example \ android \ apis \ graphics \

ファイル自体はCameraPreviewと呼ばれています。

私は本当に画面が伸びたように見える理由を知りません。もちろん、フォーマットは奇妙で正方形ではありませんが、デバイスにインストールされているデフォルトのカメラアプリを使用すると、まったく変形しません。このカメラは横向きにしてカメラを少しでも動かすと画像が変形します。私が何をしたか

enter image description here

enter image description here

だった:私は(この場合はラップトップ)のオブジェクトの写真を撮るために私のギャラクシータブを開催し、その後、私のギャラクシーの私の携帯電話で写真を撮りました。ギャラクシーでは、私が作っているアプリでカメラのスクリーンを開いている。これは両方の画像をカウントします。 1つは横向きにし、もう1つは縦向きで保持します。写真は少しはっきりしていませんが、風景写真ではカメラが大規模になっていることがわかります。

+3

T_T私はこの問題を抱えている世界で唯一の人ですか? <: –

+0

この問題も発生しています... – Saty

+0

この質問は隠された宝石です!私はこれを探して苦労しました。 Googleですべてのキーワードを使用しています。この質問は私の人生を救った。 –

答えて

21

私は昨日同じ問題に直面しました。 「カメラ」のソースを調べたところ、カメラのプレビューが伸びている理由がわかりました。

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

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

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

使用

カメラのソースを取得するにはgitのクローンhttps://android.googlesource.com/platform/packages/apps/Camera.git

+1

+1実際の問題を説明します。 SurfaceChangedでSurfaceViewの高さと幅を確認し、Camera parametersオブジェクトのgetSupportedPreviewSizesを使用して、最も近い一致を見つけ、SurfaceViewを必要な許容サイズに設定します。 –

+0

このようにしていますが動作しません。 private Camera.Size getBestPreviewSize(int width、int height、Camera.Parameters parameters){ \t Camera.Size result = null;用 \t(Camera.Sizeサイズ:parameters.getSupportedPreviewSizes()){ \t \t IF(size.width <=幅&& size.height <=高さ){ \t \t \t場合(結果== NULL){ \t \t \t \t結果=サイズ;他 \t \t \t} \t \t \t { \t \t \t \t INT resultArea = result.width * result.height。 \t \t \t \t int newArea = size.width * size.height; \t \t \t \t(newArea> resultArea){ \t \t \t \t \t結果=大きさであれば、 \t \t \t \t} \t \t \t} \t \t} \t}リターン(結果)。 } – gIrL

+1

あなたのコードは、最初の幅と高さに収まる最大のプレビューサイズを検索しています。もちろん、最大の "最高のアスペクト比"を意味しないので、ストレッチされた画面に問題があります。あなたのプレビュービューのサイズを、その幅または高さを調整することによって、その「最大」サイズに合わせる必要があります。その比率=幅/高さは、初期値(幅、高さ)と最終値(結果。幅、 result.height) – Lord

7
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(); 

私はこれがあなたを助け願っています。

関連する問題