7

非常に単純なカメラ アプリケーションのカメラ フィードを表示するために、SurfaceView を拡張しました。各デバイスに最適なプレビュー サイズを見つけるために、私が見たほぼすべてのオープン ソース カメラ アプリで使用されている次のサンプル コードを使用しました。

    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
    double minDiff = Double.MAX_VALUE;
    for (Camera.Size size : sizes) {
        if (Math.abs(size.width - width) < minDiff) {
        screenWidth = size.width;
        screenHeight = size.height;
        minDiff = Math.abs(size.width - width);
        }
    }

この時点まで、すべてが完全に機能します。

ここで、アプリケーションの性質上、セッション中に 2 つのビットマップをメモリに保持する必要があり、簡単にするために (テスト中のメモリの問題を回避するため)、PICTURE SIZE に同じコードを使用しました ( getSupportedPreviewSizes() と getSupportedPictureSizes())。ほとんどのデバイスですべてがうまく機能しますが、各デバイスに最適な画像サイズを選択するには、別の方法を決定する必要があります。

最近、Nexus 4 デバイスでのテスト中に、上記のループが最適な画像サイズの選択に失敗しました。調査の結果、getSupportedPictureSizes() 関数が、Nexus 4 カメラで実際にサポートされていない値、つまり 1280*960 を返すことがわかりました。では、この問題をどのように解決しますか? つまり、この関数は、デバイスのカメラがサポートする値のみを返すことになっていませんか? テストできない同じ問題を抱えた他のデバイスがあると確信しています。この問題をどのように解決すべきかについての手がかりはありますか?

更新:エラーなしで間違ったパラメーターを受け入れ、返される画像が歪んでいるということです。ここでも画像を取得しようとします。また、ランタイム例外はありません。

4

3 に答える 3

6

LG Lucid (モデル番号 VS840 4G) でも同じ問題があります。基本的に、getSupportedPictureSizes()次のサイズを返します。

Size        Aspect Ratio
2560x1920   (1.3333333333333333)
3072x1728   (1.7777777777777777)
2048x1536   (1.3333333333333333)
2304x1296   (1.7777777777777777)
1536x864    (1.7777777777777777)
1280x960    (1.3333333333333333)
640x480     (1.3333333333333333)

アスペクト比 1.7 のいずれかのサイズで呼び出すsetPictureSize()と、カメラ ハードウェアはエラーをスローしませんが、歪んだ画像を返します。

間違ったストライドで解釈されたピクセル バッファのように見えるものを示す、LG Lucid の歪んだ結果のサンプル

getPictureSize()このサイズが実際にはサポートされていないことをカメラ ドライバーに認めさせるために、とgetSupportedPictureFormats()を呼び出した後の結果を確認するなど、さまざまな手法を試しましたsetParameters()。この動作を放棄したものは何も見つかりませんでした。

これを回避するために、ストック カメラ アプリの動作を模倣するようになりました。getSupportedPictureSizes()リストから「優先」サイズを見つけようとしてから、最大サイズ (幅 * 高さで計算) を選択します。推奨されるサイズはすべてアスペクト比が 1.333 (4:3) であるため、このデバイスの問題は回避されます。

正確な実装については、値を設定するカメラ アプリのソース(111 行目) と優先するハードコードされたサイズ(63 行目) を参照してください。

于 2013-06-06T16:18:31.480 に答える
1

実際にそこにあるものは何ですか、しかし、要約すると、Google に感謝します!

  • 一部のデバイスは 1.33 をサポートしています
  • 一部のデバイスは 1.77 をサポートしています

私のテスト シナリオでは、4.3 の Nexus 4 と 4.4 の別の Nexus 4 の両方が1.33 をサポートしていませんが、 1.77 ...

そこにいくつのデバイスがあるか、または実際にサポートされていないタイプであるとは言えません(上記で別の方法で言及されています)..基本的に唯一のオプションです。ユーザーに決定させます。問題がある場合 -> アスペクト比を変更するオプションを提供します。

今はこうしました。

これが誰かに役立つことを願っています->幸運を祈ります:)

于 2014-04-10T21:59:09.270 に答える