2017-02-08 31 views
0

カメラを使用するアプリで、カメラのプレビューを表示する必要がある場合、サポートされているすべてのプレビューサイズを取得してプレビューサイズを設定し、一番いい。私はまた、カメラの最高の画像サイズを設定する必要がありますか?もしそうなら、プレビューサイズと画像サイズの違いは何ですか?アンドロイドカメラのプレビューサイズと画像サイズの違い

そして現在、私はこの方法を使用して最高のプレビューサイズ

int minDiff = Integer.MAX_VALUE; 
for (SizePair sizePair : validPreviewSizes) { 
    Size size = sizePair.previewSize(); 
    int diff = 
     Math.abs(size.getWidth() - desiredWidth) + Math.abs(size.getHeight() - desiredHeight); 
    if (diff < minDiff) { 
    selectedPair = sizePair; 
    minDiff = diff; 
    } 
} 

を見つけるために、下記の使用は、一部の携帯電話では、間違ったプレビューサイズを与えます。誰かが最良のpreivewサイズを得るためのよりよい論理を提案することができますか?

答えて

5

画像サイズこれは、カメラに写真を撮るように指示したときに生成される画像のサイズです。ネイティブ解像度と同じアスペクト比の場合は、それがそのまま拡大縮小されます。アスペクト比が異なる場合は、それがネイティブサイズから切り取られます。私の経験上、getSupportedPictureSizesによって返される最大サイズは、カメラのネイティブ解像度です。

プレビューサイズこれは画面上に表示される画像プレビューのサイズです。ネイティブサイズとピクチャサイズのいずれかとは異なるアスペクト比になり、さらにトリミングが発生する可能性があります。

画面に表示される内容と写真を撮るときに生成されるイメージに最も近いものを選択するには、選択した画像サイズの縦横比にできるだけ近いアスペクト比でプレビューサイズを設定します。私は一般にネイティブサイズに可能な限り近づけようとします。

もチェックthis link

1

ラリットは、カメラの画像サイズとプレビューサイズの違いを説明してください。この方法を試して、デバイスの画面サイズに関連した最適なサイズを得ることができます。

private Camera.Size getOptimalSize(Camera.Parameters params, int w, int h) { 

    final double ASPECT_TH = .2; // Threshold between camera supported ratio and screen ratio. 
    double minDiff = Double.MAX_VALUE; // Threshold of difference between screen height and camera supported height. 
    double targetRatio = 0; 
    int targetHeight = h; 
    double ratio; 
    Camera.Size optimalSize = null; 

    // check if the orientation is portrait or landscape to change aspect ratio. 
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
     targetRatio = (double) h/(double) w; 
    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     targetRatio = (double) w/(double) h; 
    } 

    // loop through all supported preview sizes to set best display ratio. 
    for (Camera.Size s : params.getSupportedPreviewSizes()) { 

     ratio = (double) s.width/(double) s.height; 
     if (Math.abs(ratio - targetRatio) <= ASPECT_TH) { 

      if (Math.abs(targetHeight - s.height) < minDiff) { 
       optimalSize = s; 
       minDiff = Math.abs(targetHeight - s.height); 
      } 
     } 
    } 
    return optimalSize; 
} 
関連する問題