2013-05-24 5 views
28

に収まるようにするために延伸、スキューされます。私はこれのためにカメラAPIを使用しています。カメラ表示/アスペクト比を維持しないフルスクリーンでプレビュー - 画像は、私はフルスクリーンでカメラのプレビューを表示するための小さなアプリケーションを開発している画面

これは活性レイアウトである:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

    <!-- This is the container for the camera preview screen --> 
    <FrameLayout android:id="@+id/camera_preview" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"/> 
</LinearLayout> 

デバイスがポートレートである場合、ディスプレイが垂直デバイスの画面の高さを一致させるためにスケーリングされる - アスペクト比がより1と同じではないのでネイティブカメラ。

enter image description hereenter image description here

最初のイメージは、ネイティブのカメラ装置で構成されています。これらは私が言っているものをよりよく説明して2つの画像です。 2番目の画像は私のアプリで作られ、カメラはフルスクリーンで表示されます。画像は歪んで画面に収まるように引き伸ばされています。

私は関係なく、getSupportedPreviewSizes() mehodにより歪みなしに、特定のプレビューサイズの、フルスクリーンであることをカメラのプレビューを必要としています。 これを行う方法はありますか?カメラプレビューがフルスクリーンで表示されているときに適切な縦横比を維持する方法はありますか?私はこれをOSが自動的に行うことを期待していました。アスペクト比を維持しながら要求された解像度に合わせてイメージを切り取っていましたが、これは起こりません。

私は、この質問に続くの表示よりも大きくしようとしましたが、キャプチャしたスナップショット(6フレーム/秒)と私の場合は大丈夫ではありません。 (フレームにすべてが表示されていなくても、フレームにはすべてのカメラプレビューが含まれています)。

私はここに掲載:https://www.dropbox.com/s/3d52xt8kazynsae/CameraFullScreen.7z?v=0mcn私が作ったプロジェクト全体を。

任意のアイデア/ソリューションは、私にとって重要ではありません。どうもありがとう。

==============================================原因ss1271の答えに==========================

更新:

私は、解像度を少し分析しますあなたはのSamsung Galaxy Ace IIのために上に書いた。

I.画面解像度:480X800 - アスペクト比3:5 = 0,6

II。 getSupportedPreviewSizes - 私はこれらの値が裏カメラからのものであると確信しています。以下にこれらの解像度のための側面の比率である:

2560x1920 - 0,75 

    2560x1536 - 0,60 

    2048x1536 - 0,75 

    2048x1232 - 0,60 

    960x720  - 0,75 

    640x480  - 0,75 

だから、あなたの方法は、2560x1536または2048x1232に対応Sizeが返される - これらの画面解像度と同じアスペクト比を有し、これらの値を使用してはいないであろう画像を歪ませる。 私にとっての問題は、私は6フレーム/秒と低い解像度で保存するこれらのニーズを取り込むので、私はとても大きな解像度を使用することができないということです。

IはサムスンS2デバイスからいくつかの結果の下に存在します:

I.画面解像度:480×800 - アスペクト比3:5 = 0,6

II。バックカメラ
a)。 getSupportedPreviewSizes

800/480 - 480/800 = 0,60 
800/450 - 450/800 = 0,56 
720/480 - 0,66 
640/480 - 0,75 
352/288 - 0,81 
320/240 - 0,75 
176/144 - 0,81 

b)。ネイティブカメラの解像度:

3264/2448 - 0,75 - not full screen 
3264/1968 - 0,60 - FULL SCREEN (since has the same aspect ratio as device screen) 
2048/1536 - 0,75 - not full screen 
2048/1232 - 0,60 - FULL SCREEN (same aspect ratio as device screen) 
800/480 - 0,60 - FULL SCREEN (same aspect ratio as device screen) 
640/480 - 0, 75 - not full screen 

III。フロントカメラ
a)。 getSupportedPreviewSizes

640/480 - 0,75 
352/288 - 0,81 
320/240 - 0,75 
176/144 - 0,81 

b)。ネイティブカメラがフルスクリーンではなく、解像度を選択できません - このオプションは無効です。

S2カメラの場合、getSupportedPreviewSizes()メソッドがネイティブカメラと同じ解像度を返さないのはなぜですか、またはネイティブカメラで表示される解像度は画像サイズですか?私はgetSupportedPreviewSizes()メソッドで与えられた3264/1968,2048/1232のようなオプションがないのはなぜだろうか? :一言で言えば enter image description here

+0

正しいアスペクト比を維持するために実際にカメラのプレビューを切り取るのですか – Paul

+0

私は質問するかもしれません:カスタマイズされたカメラが必要ですか、単にカメラのビューファインダー(プレビュー)を表示したいですか? – dumbfingers

+0

私はオーバレイボタン付きのカスタマイズされたカメラを持っています。 – Paul

答えて

23

、あなたはしかし、あなたがカスタマイズされたカメラのプレビューは、あなたが望むものである場合にのみ、自分でサポートされ、プレビューサイズの中から適切なサイズを見つける必要がありますフルスクリーンでカメラのプレビューを行うことができます。あなたはカメラのプレビューのための特定のサイズを設定したい場合は上記のコメントで述べたように、あなたの質問については

は、Android Developers -- Camera

によると、surfaceChanged()方法でこの を設定します。 プレビューサイズを設定すると、の値を使用する必要があります。 getSupportedPreviewSizes() setPreviewSize()メソッドに任意の値を設定しないでください。

getSupportedPreviewSizes()が提供するサイズ以外のサイズを手動で渡すことはできないようでした。お使いの携帯電話のカメラでサポートされているサイズを詳しく調べると、サポートされているサイズの比率が画面の比率とまったく同じではないことがわかります。例えば

は、サムスンギャラクシーエースIIはgetSupportedPreviewSizes()から返さSizeを読むことによって、480X800解像度の画面を持って、そのカメラがサポートされています。

2560x1920

2560x1536

2048×1536

2048x1232

960x720

640×480

、あなたは(ストレッチなし)が正しく、フルスクリーンであなたのカメラのプレビューを表示したい場合、あなたは、算出し比較し、これらのサポートのプレビューサイズの適切な比率を適用する必要があります。

適切なプレビューサイズを見つけることの実装はそれほど複雑ではありません。これを行うための一般的な方法は、このようなものになるだろう:

/** 
    * Calculate the optimal size of camera preview 
    * @param sizes 
    * @param w 
    * @param h 
    * @return 
    */ 
    private Size getOptimalSize(List<Size> sizes, int w, int h) { 

     final double ASPECT_TOLERANCE = 0.2;   
     double targetRatio = (double) w/h;   
     if (sizes == null)    
      return null;   
     Size optimalSize = null;   
     double minDiff = Double.MAX_VALUE;   
     int targetHeight = h;   
     // Try to find an size match aspect ratio and size   
     for (Size size : sizes) 
     {    
//   Log.d("CameraActivity", "Checking size " + size.width + "w " + size.height + "h");    
      double ratio = (double) size.width/size.height;    
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)     
       continue;    
      if (Math.abs(size.height - targetHeight) < minDiff) 
      {     
       optimalSize = size;     
       minDiff = Math.abs(size.height - targetHeight);    
      }   
     }   
     // Cannot find the one match the aspect ratio, ignore the requirement  

     if (optimalSize == null) 
     { 
      minDiff = Double.MAX_VALUE;    
      for (Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) 
       { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 

     SharedPreferences previewSizePref; 
     if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) { 
      previewSizePref = getSharedPreferences("PREVIEW_PREF",MODE_PRIVATE); 
     } else { 
      previewSizePref = getSharedPreferences("FRONT_PREVIEW_PREF",MODE_PRIVATE); 
     } 

     SharedPreferences.Editor prefEditor = previewSizePref.edit(); 
     prefEditor.putInt("width", optimalSize.width); 
     prefEditor.putInt("height", optimalSize.height); 

     prefEditor.commit(); 

//  Log.d("CameraActivity", "Using size: " + optimalSize.width + "w " + optimalSize.height + "h");    
     return optimalSize;  
    } 

そして、あなたはまた、適切なカメラのサイズ(出力画像サイズ)を見つけるために同様の操作を行うことができます。

注:インターネットから上記のコードの元のバージョンが見つかりました。自分の目的に合わせていくつかの修正/最適化を行いました。

これがうまくいくかどうかお知らせください。

+0

まず、お返事いただきありがとうございます。私はより良い可視性のためにあなたの答えに対応するために質問を更新しました。私のアプリケーションは、バックカメラよりフロントカメラを使用しています。アスペクト比の問題が原因でネイティブカメラがフロントカメラを(少なくともS2とS3の電話にはない)フルスクリーンで表示しないと、同じことをすることはできません画像を歪ませることなく... – Paul

+0

ありがとうございます! setPreviewSize()を使用しないと、私の問題が解決しました。 – BVB

+2

このスレッドをお持ちの方、こちらもご覧ください:http://stackoverflow.com/questions/17348614/make-a-surfaceview-larger-than-the-screen-fitting-a-camera-preview-to-a -surface – Sam

0

私はCamera2 APIで同じ問題に直面していましたが、私はPreview size and devices aspect ratioを使用して問題を解決しました。カメラAPIでも同じことができます。